【发布时间】:2010-01-16 14:55:28
【问题描述】:
如果委托是抽象的,那么它如何允许创建对象
【问题讨论】:
如果委托是抽象的,那么它如何允许创建对象
【问题讨论】:
这是我找到的关于 C# 委托的最佳文章之一的链接,作者在提供关于委托如何工作以及我们为什么使用它们的有趣且信息丰富的演练方面做得很好。
http://www.sellsbrothers.com/writing/default.aspx?content=delegates.htm
【讨论】:
delegate 是一个类型安全的函数指针。它是 C# 中的引用类型。
delegate result-type identifier ([parameters]);
但是Delegate类并不是一个委托类型,它是一个用于派生委托类型的类,因此它是抽象的(check for more clarification)。
【讨论】:
委托看起来像一个类型安全的函数指针,当然要了解您需要知道函数指针是什么以及类型安全为何如此重要,但不仅如此。
在幕后,委托是具有 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 函数),并且它是类型安全的,因为它只接受并返回定义的类型(规则比这复杂一点) .
您现在还可以通过其他方式调用委托著名的匿名方法和 lambda,但这超出了本文的范围
很多这种情况都发生在编译器的魔法中,例如将委托定义转换为类定义并将对方法的调用转换为对 Invoke 的调用。
HTH
【讨论】:
这是一个关于委托的优秀article,稍后讨论突出它们之间关系的 Lambda 表达式。
希望这会有所帮助。
【讨论】: