永发信息网

C#中委托如何使用?

答案:3  悬赏:60  手机版
解决时间 2021-04-07 08:26
  • 提问者网友:绫月
  • 2021-04-07 05:36
C#中委托如何使用?
最佳答案
  • 五星知识达人网友:鱼忧
  • 2021-04-07 07:01
1.历史上Windows API经常使用C语言风格的函数指针来创建称为回调函数或简称为回调的实体。【回调(callback)一词本身指的是可以作为参数传给其他代码的一段可执行代码。普通调用往往是高层代码(如应用程序)去调用处在低层的函数(如系统函数、库函数)。而回调时,则是在低层函数执行时调用高层代码。】使用回调,程序员可以使一个函数返回报告给程序中的另一个函数。C风格回调函数问题在于,它们除了提供原始内存地址外无法表示其他信息。而我们希望回调中应该包含更多的类型安全信息,如参数数量和类型、所指向方法的返回值。为达到这一要求,在.NET FRAMEWORK 里,使用了更为安全和面向对象的委托来实现回调。
2. 委托是一个类型安全的对象,它指向程序中另一个(或多个)以后会被调用的方法。委托包含3个重要信息:
所调用方法名称
该方法参数(可选)
该方法返回值(可选)
3.例如我们定义一个名为IntCalc的委托:
public delegate int IntCalc(int x,int y)
它可以指向任何输入两个整数返回一个整数的方法。当用C#处理委托类型时,它会自动产生一个派生自System.MulticastDelegate的密封类,这个类与它的基类System.Delegate一起为委托提供必要的基础设施,以维护以后要调用方法的列表。
C#委托定义生成的密封类有三个编译器生成的方法,这三个方法的参数和返回值基于委托的声明,伪代码如下:
Public sealed Class DelegateName: System.MulticastDelegate
{
public DelegateName (object target,uint functionAddress);
public delegateReturnValue Invoke(allDelegateInputRefAndOutParams);
public IAsynResult BeginInvoke(allDelegateInputRefAndOutParams,AsynCallback cb,object state);
public delegateReturnValue EndInvoke(allDelegateInputRefAndOutParams,IAsyncResult result);
}
4.由于上述几个函数涉及多线程调用,本人对此不甚了解,不再赘述。
相对于这些原理性的东西,相信大家更加关心的是委托的用法,
5.对于委托的用法,我还要补充两点。一是匿名方法,一是Lamda表达式。
由于一些方法很少被调用委托之外的任何程序调用,从生产效率的角度来说,手工定义一个由委托对象调用的方法有点繁琐。为解决这一情况,可以在事件注册时直接将一个委托与一段代码相关联,这种代码的正式名称是匿名方法。
6.如下例:
已经定义了public delegate int IntCalc(int x,int y)
我们可以这样进行注册
IntCalc cal =new IntCalc( delegate(int x , int y){ return x + y};);
匿名方法可以使我们访问定义它们的方法的局部变量,这些局部变量称为匿名方法的外部变量。

int t;
IntCalc cal = delegate(int x , int y){ return x * y*t};
Lamda表达式提供了更为简单的匿名方法注册方式,彻底简化了对.NET委托类型的使用。
Lamda表达式是这样编写的,首先定义一个参数列表,“=>”标记紧随其后,然后就是表达式。表达式可以理解为:ArgumentToProcess => StatesToProcessThem.
上述委托注册可以写为
IntCalc cal =new IntCalc( ( x, y)=>(x+y));
7.委托可以在泛型中得到广泛应用,利用委托,我们可以自定义大小比较、匹配等的规则,从而可以很方便的调用List自带函数,免去许多不必要的麻烦,大大提高编程效率。
全部回答
  • 1楼网友:低血压的长颈鹿
  • 2021-04-07 07:29
其实你双击产生的代码就是和委托来绑定带一起的啊
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯