首页 > 代码库 > 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