C#委托可以看做是方法引用,或者叫方法指针,它和c++中使用的函数指针最大的区别就是委托是类型安全的。
委托声明时必须将方法的返回值和详细的参数列表列出来,这样在为委托指定方法时,可以进行类型安全的检查。
委托声明的方式如下:
public delegate int AddHandler(int value);
委托的关键字是delegate,除去这个关键字,其余部分就是一个完整的方法签名的格式,包括了委托返回类型、委托名称和委托所需的详细参数列表。
为委托指定方法有以下几种方式:
Code
1 public delegate int AddHandler(int value);
2
3 public int Add(int value)
4 {
5 System.Console.WriteLine(value);
6 return value + 1;
7 }
8
9 //通过实例化的方式来为委托指定方法
10 AddHandler addHandler = new AddHandler(Add);
Code
public delegate int AddHandler(int value);
public int Add(int value)
{
return value + 1;
}
//通过直接指定的方式为委托指定方法
AddHandler addHandler = Add;
Code
1 public delegate int AddHandler(int value);
2
3 //通过匿名方法的方式为委托指定方法
4 AddHandler addHandler = delegate(int value) { return value + 1; };
使用委托的方式:
addHandler(5);
一个委托可以指定多个方法,当一个委托被指定多个方法后,在执行委托时,它指定的方法会被依次调用。
Code
1 public delegate int AddHandler(int value);
2
3 public int Add(int value)
4 {
5 value += 1;
6 System.Console.WriteLine(value);
7 return value;
8 }
9
10 public int Add2(int value)
11 {
12 value += 2;
13 System.Console.WriteLine(value);
14 return value;
15 }
16
17 public void Test()
18 {
19 //为委托addHandler指定Add方法
20 AddHandler addHandler = Add;
21 //将Add2方法添加到addHandler中
22 addHandler += Add2;
23
24 addHandler(5);
25 }
我们通过+=操作来为委托添加方法,通过-=操作来为委托去除方法。
有时,委托和接口会发生混淆,委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。
Code
1 public delegate int AddHandler(int value);
2
3 public int Add(int value)
4 {
5 value += 1;
6 return value;
7 }
8
9 public void Test(AddHandler addHandler, int value)
10 {
11 System.Console.WriteLine(addHandler(value));
12 }
我们可以按照以下的方式来使用Test方法
Test(program.Add, 5);
但是我们也可以使用接口的方式来实现上面委托实现的功能
Code
interface IAddHandler
{
int Add(int value);
}
class MyAddhandler : IAddHandler
{
public int Add(int value)
{
value += 1;
return value;
}
}
public void MyTest(IAddHandler addHandler, int value)
{
System.Console.WriteLine(addHandler.Add(value));
}
我们可以按照以下的方式来使用MyTest方法
MyAddhandler addHandler = new MyAddhandler();
MyTest(addHandler, 5);
那么如何去却分委托和接口呢,MSDN上是这么建议的:
在以下情况中使用委托:
在以下情况中使用接口: