什么是委托以及它如何允许创建对象

如果委托是抽象的,那么它如何允许创建对象

这里是我发现的关于C#代表的最佳论文之一的链接,作者在提供有关代表如何工作以及我们使用它们的原因的有趣和丰富的演练方面做得很好。

http://www.sellsbrothers.com/writing/default.aspx?content=delegates.htm

delegate是一个类型安全的函数指针。 它是C#中的引用类型。

delegate result-type identifier ([parameters]); 

但是Delegate类不是委托类型,它是用于派生委托类型的类,因此它是抽象的(检查更多说明) 。

委托看起来像一个类型安全的函数指针,当然要理解你需要知道函数指针是什么以及为什么类型安全很重要,但它不止于此。

在封面下,委托是一个带有Invoke方法的类,Invoke方法在编译时创建,以具有与委托定义相同的签名。 所以,如果我这样做

委托int MyDelegate(string s);

我最终得到了类似的东西

 class MyDelegate : MulticastDelegate { int Invoke(string s) {...} } 

我可以在这样的代码中使用它

 int SomeFunc(string s) { // do something with s and return an int } MyDelegate del = new MyDelegate(SomeFunc); 

那么

 int a = del.Invoke("Foo"); 

或简单地说

 int a = del("Foo"); 

这是最后一个使用它使它看起来像一个函数指针(’del’指向SomeFunc函数),它是类型安全的,因为它只接受并返回定义的类型(规则比这更复杂)。

您现在还有其他方法可以调用委托着名的匿名方法和lambdas,但这超出了这个范围

编译器魔术会发生很多这种情况,例如将委托定义转换为类定义并将对方法的调用转换为对Invoke的调用。

HTH

这是一篇关于委托的优秀文章 ,后来讨论了突出它们之间关系的Lambda表达式。

希望这可以帮助。