我一直在阅读代表们的MSDN page,看起来很简单。然后我看了一些使用它们的代码,我看到了:
public delegate void NoArguments();
public NoArguments Refresh = null;
Refresh = new NoArguments( Reset );
第三行令我困惑。你怎么能new
代表?它不是一个对象,它是一个方法,或者更确切地说是一个方法的委托。根据MSDN页面上的示例,创建委托实例是通过简单的分配,而不是分配。此外,当委托声明不带参数时,为什么委托的new
采用参数Reset
?
答案 0 :(得分:4)
delegate
关键字表示后面的内容本质上是一个函数签名,因此,Refresh
有点像指向不带参数的函数的指针。但是,要为Refresh
指针指定一些内容,您必须为其指定一个函数。在这种情况下,它是Reset
函数。而且,Reset
函数必须不带参数。
另外,语法:
Refresh = Reset;
也是有效的,并且只是更正式语法的语法糖:
Refresh = new NoArguments(Reset);
在这两种情况下,您都可以通过调用Refresh:
来执行Reset函数Refresh();
但请注意,如果在没有分配的情况下执行Refresh()
,则可能会生成异常。防止这种情况的方法是检查它是否为null:
if (Refresh != null) Refresh();
else {
// Refresh was never assigned
}
答案 1 :(得分:2)
您可能认为委托就像一个函数类型:
声明类型,函数返回void并且没有参数:
public delegate void NoArguments();
声明给定类型的变量并初始化它:
public NoArguments Refresh = null;
为变量指定新对象。对象实际上是一个函数Reset
,它必须与您的委托具有相同的签名:
Refresh = new NoArguments( Reset );
<强>更新强>
您可以查看以下链接以获取更多详细信息:C# Delegates
答案 2 :(得分:1)
委托是&#34;委托给方法&#34;,但也是一个对象。如果您在任何反编译器中查看NoArguments
,您会发现它实际上是一个继承自MulticastDelegate
的类,有多种方法(Invoke
,BeginInvoke
,EndInvoke
)。
由于历史原因,C#允许您使用new NoArguments(method)
创建该类的实例。但是在现代版本中,它还支持快捷符号method
,它可以执行相同的操作。在这两种情况下,您实际上在NoArguments
中都有Refresh
类型的对象。