C# in depth 阅读笔记-- 委托
委托(delegate)
1. 相当于C语言的函数指针,执行委托,就是执行相应代理的方法.
2. 使用委托的步骤
a. 声明委托类型(delegate)
委托的签名决定了委托可以代理的方法的类型,方法的签名要去委托的签名一致
例:delegate void StringProcessor (string input);
b. 定义要执行的方法
以下5个方法中,只有第1个跟最后一个方法的签名与委托一致,才可以被委托调用。
void PrintString (string x)
void PrintInteger (int x)
void PrintTwoStrings (string x, string y)
int GetStringLength (string x) //返回值不一样也不行
void PrintObject (object x) //object是string的基类
c. 创建委托对象
StringProcessor proc1, proc2;
proc1 = new StringProcessor(StaticMethods.PrintString); //指向一类方法
InstanceMethods instance = new InstanceMethods();
proc2 = new StringProcessor(instance.PrintString); //指向一实例方法
d. 调用执行委托对象
每个委托对象都有个Invoke(参数)方法去执行委托,但是也可以把委托对象就看作是个方法,直接执行
3. 示例
using System;
delegate void StringProcessor(string input);
class Person
{
string name;
public Person(string name)
{
this.name = name;
}
public void Say(string message)
{
Console.writeLine ("{0} says: {1}", name, message);
}
}
class Background
{
public static void Note(string note)
{
Console.writeLine ("({0})", note);
}
}
class SimpleDelegateUse
{
static void Main()
{
Person jon = new Person("Jon");
Person tom = new Person("Tom");
StringProcessor jonsVoice, tomsVoice, background;
jonsVoice = new StringProcessor(jon.Say);
tomsVoice = new StringProcessor(tom.Say);
background = new StringProcessor(Background.Note);
jonsVoice("Hello, son.");
tomsVoice.Invoke("Hello, Daddy!");
background("An airplane flies past.");
}
}
4. 委托的合并与删除(Combining and removing delegates)
一个委托可以代理一个方法,其实也可以代理很多的方法,通过合并操作,可以合并多个委托构成一个 代理列表(invocation list), 这样执行该委托就可以执行列表里的一序列方法。同理,可以从这个列表里删除某一委托,就是删除代理的某一方法。
委托具有不变性,跟字符串的不变性一样,一旦创建了个委托对象就不可改变该委托,委托的合并与删除都会返回一个新的委托
合并的方法: Delegate.Combine(x,y) 简写 + 或 +=
删除的方法: Delegate.Remove(source,value) 简写 - 或 -=
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5. 委托一般不单独使用,一般用在事件里
事件并不是委托的实例,是Add/Remove方法对,相当于属性的getters/settters