C#.Net笔记其之三:委托
- 若覆写了 Equals() 方法,也必须覆写 GetHashCode() 方法,保证两个相等的对象拥有一致的 HashCode。
- 自定义异常不应从基类 SystemException 派生,而推荐继承于 ApplicationException。ApplicationException 扩展 Exception,但不添加新功能。此异常作为一种区分应用程序定义的异常与系统定义的异常的方法而提供。
- 委托:
委托是一种定义了引用方法的类型。我们能为委托分配和它具有相同方法签名的静态或者实例方法。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。它就类似于 C++ 中的函数指针,但委托更安全可靠。委托就像是一类具有相同签名的方法的抽象,把它看作一个类就很好理解了。
一个委托实例可以搭载多个方法。不过要求方法的返回值为空,且不能有输出参数。
一个委托实例所搭载的方法并不需要属于同一个类。
委托的声明:
太麻烦了,直接例子。
namespace cnblogs
//声明直接放 namespace 后面就行了
public delegate void blogNow(string userID);
public class Bloger() {
}
我仿造msdn webcast morden c# 11讲中的例子写的:
经典例子:一个C#睡前故事。
using System;

namespace dz2345
{
public delegate void BlogNow(string s);
public class Bloger
{
string userID;
public Bloger(string id)
{
this.userID = id;
}
//bloger做了动作之后,会得到结果反馈
public void WriteArticle(string s)
{
Console.WriteLine("{0}更新了{1}", userID, s);
}
public void UploadPhoto(string category)
{
Console.WriteLine("{0}更新了{1}", userID, s);
}
}
public class ArticleSystem
{
//这里event写成new能通过,但会警告;其实等价于
//实例化 BlogNow NewArticleHandle=new BlogNow()
public event BlogNow NewArticleHandler;
public void Accept()
{
if (NewArticleHandler!=null)
{
NewArticleHandler("文章");
}
}
//这里是实现的是多播委托,所以能相加
public void NewRequest(BlogNow bn)
{
NewArticleHandler += bn;
}
}
public class PhotoSystem
{
public event BlogNow NewPhotoHandler;
public void Accept()
{
if (NewPhotoHandler != null)
{
NewPhotoHandler("照片");
}
}
public void NewRequest(BlogNow bn)
{
NewPhotoHandler += bn;
}
}
class Program
{
static void Main(string[] args)
{
ArticleSystem a = new ArticleSystem();
PhotoSystem p = new PhotoSystem();
Bloger b1 = new Bloger("刘备");
Bloger b2 = new Bloger("关羽");
Bloger b3 = new Bloger("张飞");
//给委托传入具体的方法
a.NewRequest(new BlogNow(b1.WriteArticle));
a.NewRequest(new BlogNow(b2.WriteArticle));
p.NewRequest(new BlogNow(b2.UploadPhoto));
p.NewRequest(new BlogNow(b3.UploadPhoto));
a.Accept();
p.Accept();
Console.ReadLine();
}
}
}

浙公网安备 33010602011771号