浅析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
下面声明一个delegate实例,然后调用。
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

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
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

输出结果是:
葱花吃西瓜
样样吃西瓜
大蒜吃西瓜
但是:声明三次方法过于麻烦,用"委托链"解决。代码如下:
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
为了让程序富有逻辑性,同时为了说明C#2.0的匿名方法,请看如下代码:
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

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
请注意:上面chEat(),yyEat(),dsEat()过于繁琐,可以用C# 2.0匿名方法解决:
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

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
输出结果:
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

葱花吃西瓜
样样吃西瓜
大蒜吃西瓜
由此可以得出委托的特点:
(1)委托是类型安全的。
(2)委托允许将方法作为参数传递。
(3)委托可以定位回调方法。
(4)委托可以定义委托链。



浙公网安备 33010602011771号