首页 > 代码库 > C#_委托Delegate

C#_委托Delegate


委托


 

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

 

声明委托(Delegate)

委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。

 

1 delegate 函数返回类型 委托名 (<方法参数列表>);

 

实例化委托(Delegate)

委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。

 

1 委托类型 实例名 = new 委托类型 (<注册方法>);

通过委托实例来调用方法,执行委托实例就等同于执行注册方法。

 

匿名函数初始化委托

为初始化委托而专门定义方法较为麻烦,通常调用委托实例初始化时赋值的方法,而不直接调用方法本身。

 格式如下:

1 delegate 委托(函数)返回类型 委托类型(函数参数列表);
2 
3 委托类型 委托实例= new 委托类型(delegate(<函数参数列表:类型 形参名,类型 形参名...>)
4 {
5     //函数体
6 });

或者省去new关键字。

1 delegate 委托(函数)返回类型 委托类型(函数参数列表);
2 
3 委托类型 委托实例= delegate(<函数参数列表:类型 形参名,类型 形参名...>)
4 {
5     //函数体
6 };

 

委托的多播(Multicasting of a Delegate)

委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。

利用多播可以将委托中的函数类似数据一样扩展或消减。

 

技术分享
 1 namespace _9_delegate_2_20170801
 2 {
 3     class TestDelegate
 4     {
 5         public static void PrintfA()
 6         {
 7             Console.WriteLine("PrintfA !");
 8         }
 9 
10         public static void PrintfB()
11         {
12             Console.WriteLine("PrintfB !");
13         }
14     }
15     delegate void Mydelegate();
16 
17     class Program
18     {
19         static void Main(string[] args)
20         {
21             // 创建委托实例
22             Mydelegate d;
23             Mydelegate da = new Mydelegate(TestDelegate.PrintfA);
24             Mydelegate db = new Mydelegate(TestDelegate.PrintfB);
25             d = da;
26             d += db;
27             // 调用多播
28             Console.WriteLine("调用委托实例d ==da+db:");
29             d();
30             d -= da;
31             Console.WriteLine("调用委托实例d ==db:");
32             d();
33         }
34     }
35 }
委托多播例子


委托的好处


1、操作函数更加灵活,就像使用变量一样方便,具有动态性,可避免程序中大量的使用分支语句。

2、与C++,C中的函数指针相比,委托是面向对象、类型安全、可靠的受控对象。委托能保证指向一个安全有效不会越界的储存函数的地址。

3、与C++,C中的函数指针相比,指针只能指向静态函数,委托可以引用静态函数也可以引用非静态成员函数

当程序必须调用一个方法来执行某个操作,但编译无法确定是什么方法时,就可以使用委托。

 

C#_委托Delegate