委托与委托关键字

Hou*_*man 37 .net delegates

如果您想创建自定义委托,则可以使用delegate小写的关键字.

你能用实际的Delegate班级做什么?这有什么用?我不明白确切的区别.

Gis*_*shu 38

delegate关键字是让编译器为你做一些魔术.当您使用自定义签名声明新委托时,

  • 编译器为您从MulticastDelegate派生的新类型(从Delegate派生而来).
  • 编译器使用您的自定义签名添加Invoke方法
  • 类似地,编译器为这种新类型添加了BeginInvoke和EndInvoke方法

所以现在当你调用时delObject(args)- 编译器会将其转换为delObject.Invoke(args)

Delegate基类提供了一些功能,例如

  1. CreateDelegate(用于获取包装静态/实例方法的委托)
  2. DynamicInvoke(用于调用带有参数列表的委托 - 后期绑定)
  3. 组合和删除(用于委托链接..链接多个委托,例如一个事件的多个事件处理程序委托)

C#编译器禁止您在代码中explcitly派生..您必须使用delegate关键字.


Luk*_*keH 35

来自http://msdn.microsoft.com/en-us/library/system.delegate.aspx:

Delegate类是委托类型的基类.但是,只有系统和编译器可以从Delegate类或MulticastDelegate类中明确派生.也不允许从委托类型派生新类型.所述 Delegate类不被认为是委托类型; 它是一个用于派生委托类型的类.

大多数语言都实现了一个delegate 关键字,这些语言的编译器能够从MulticastDelegate类中派生出来 ; 因此,用户应使用delegate该语言提供的关键字.


gal*_*ets 5

您可以使用delegate关键字做的另一件事是创建内联委托,而无需声明它们,例如:

// constructor
public Form1()
{
    this.Load += delegate(object sender, EventArgs e)
    {
         // Form1_Load code goes right here
    }
}
Run Code Online (Sandbox Code Playgroud)