浅析C#中的委托
浅析C#中的委托:
首先通过一个例子来阐述delegate的用法。
输出结果是:
葱花吃西瓜
样样吃西瓜
大蒜吃西瓜
但是:声明三次方法过于麻烦,用"委托链"解决。代码如下:
葱花吃西瓜
样样吃西瓜
大蒜吃西瓜
由此可以得出委托的特点:
(1)委托是类型安全的。
(2)委托允许将方法作为参数传递。
(3)委托可以定位回调方法。
(4)委托可以定义委托链。
首先通过一个例子来阐述delegate的用法。
1
using System;
2
class MyDelegate
3
{
4
static void chEat(string food)
5
{
6
Console.WriteLine("葱花吃"+food);
7
}
8
static void Main()
9
{
10
chEat("西瓜");
11
}
12
}
13![](/Images/OutliningIndicators/None.gif)
下面声明一个delegate实例,然后调用。 ![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
13
![](/Images/OutliningIndicators/None.gif)
1
using System;
2
delegate void EatDelegate(string food);//此处签名应该与chEat方法签名保持一致
3
class MyDelegate
4
{
5
static void chEat(string food)
6
{
7
Console.WriteLine("葱花吃"+food);
8
}
9
static void Main()
10
{
11
EatDelegate ch=new EatDelegate(chEat);
12
ch("西瓜");
13
}
14
}
15![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
14
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
15
![](/Images/OutliningIndicators/None.gif)
输出结果是:
葱花吃西瓜
样样吃西瓜
大蒜吃西瓜
但是:声明三次方法过于麻烦,用"委托链"解决。代码如下:
1
using System;
2
delegate void EatDelegate(string food);
3
class MyDelegate
4
{
5
static void chEat(string food)
6
{
7
Console.WriteLine("葱花吃"+food);
8
}
9
static void yyEat(string food)
10
{
11
Console.WriteLine("样样吃"+food);
12
}
13
static void dsEat(string food)
14
{
15
Console.WriteLine("大蒜吃"+food);
16
}
17
static void Main()
18
{
19
EatDelegate ch=new EatDelegate(chEat);
20
EatDelegate yy=new EatDelegate(yyEat);
21
EatDelegate ds=new EatDelegate(dsEat);
22
EatDelegate EatChain; //使用委托链解决
23
eatChain=ch+yy+ds;
24
eatChain("西瓜");
25
}
26
}
27![](/Images/OutliningIndicators/None.gif)
为了让程序富有逻辑性,同时为了说明C#2.0的匿名方法,请看如下代码: ![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
27
![](/Images/OutliningIndicators/None.gif)
1
using System;
2
delegate void EatDelegate(string food);
3
class MyDelegate
4
{
5
static void chEat(string food)
6
{
7
Console.WriteLine("葱花吃"+food);
8
}
9
static void yyEat(string food)
10
{
11
Console.WriteLine("样样吃"+food);
12
}
13
static void dsEat(string food)
14
{
15
Console.WriteLine("大蒜吃"+food);
16
}
17
static void Main()
18
{
19
EatDelegate ch=new EatDelegate(chEat);
20
EatDelegate yy=new EatDelegate(yyEat);
21
EatDelegate ds=new EatDelegate(dsEat);
22
EatDelegate eatChain;
23
Console.WriteLine("葱花,样样,大蒜在聊天");
24
eatChain=ch+yy+ds;
25
eatChain("西瓜");
26
Console.WriteLine("葱花出去接她男朋友的电话");
27
eatChain-=ch; //C sharp重载了-= +=
28
eatChain("葡萄");
29
Console.WriteLine("葱花约会回来了");
30
eatChain+=ch;
31
eatChain("芒果");
32
}
33
}
34![](/Images/OutliningIndicators/None.gif)
请注意:上面chEat(),yyEat(),dsEat()过于繁琐,可以用C# 2.0匿名方法解决: ![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
33
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
34
![](/Images/OutliningIndicators/None.gif)
1
using System;
2
delegate void EatDelegate(string food);
3
class MyDelegate
4
{
5
static void Main()
6
{
7
EatDelegate eatChain=null;
8
eatChain+=delegate(string food){Console.WriteLine("葱花吃"+food);};
9
eatChain+=delegate(string food){Console.WriteLine("样样吃"+food);};
10
eatChain+=delegate(string food){Console.WriteLine("大蒜吃"+food);};
11
eatChain("西瓜");
12
}
13
}
14![](/Images/OutliningIndicators/None.gif)
输出结果: ![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
13
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
14
![](/Images/OutliningIndicators/None.gif)
葱花吃西瓜
样样吃西瓜
大蒜吃西瓜
由此可以得出委托的特点:
(1)委托是类型安全的。
(2)委托允许将方法作为参数传递。
(3)委托可以定位回调方法。
(4)委托可以定义委托链。