C# 这个委托方法在做什么?
我一直在读关于代表的文章,他们似乎很直截了当。然后我看了一些使用它们的代码,我看到了:C# 这个委托方法在做什么?,c#,C#,我一直在读关于代表的文章,他们似乎很直截了当。然后我看了一些使用它们的代码,我看到了: public delegate void NoArguments(); public NoArguments Refresh = null; Refresh = new NoArguments( Reset ); 第三行让我困惑。如何新建代理?它不是一个对象,它是一个方法,或者更确切地说是一个方法的委托。根据MSDN页面上的示例,创建委托实例是通过简单的赋值,而不是allocaiton。此外,当委托声
public delegate void NoArguments();
public NoArguments Refresh = null;
Refresh = new NoArguments( Reset );
第三行让我困惑。如何
新建代理?它不是一个对象,它是一个方法,或者更确切地说是一个方法的委托。根据MSDN页面上的示例,创建委托实例是通过简单的赋值,而不是allocaiton。此外,当委托声明不带任何参数时,为什么委托的新要带参数,重置
。委托关键字表示后面的本质上是函数签名,因此,Refresh
有点像指向不带参数的函数的指针。但是,要为Refresh
指针分配某些内容,必须为其指定一个指向的函数。在这种情况下,它是重置
功能。而且,Reset
函数不能接受任何参数
此外,语法:
Refresh = Reset;
也是有效的,只是更正式语法的语法糖:
Refresh = new NoArguments(Reset);
在这两种情况下,您都可以通过调用Refresh执行重置功能:
Refresh();
但是,请注意,如果在未分配的情况下执行Refresh()
,则可能会生成异常。防止出现这种情况的方法是检查它是否为空:
if (Refresh != null) Refresh();
else {
// Refresh was never assigned
}
您可能认为委托类似于函数类型:
- 声明类型,函数返回void且没有参数:
public delegate void NoArguments();
- 声明给定类型的变量并初始化它:
public NoArguments Refresh = null;
- 将新对象指定给变量。对象实际上是一个函数
重置
,它必须与您的代理具有相同的签名:
Refresh = new NoArguments( Reset );
更新:
您可以查看以下链接以了解更多详细信息:委托是“委托给方法”,也是一个对象。如果您查看任何反编译器中的NoArguments
,您将看到它实际上是一个从MulticastDelegate
继承的类,具有多个方法(Invoke
,BeginInvoke
,EndInvoke
)
由于历史原因,C允许您使用newnoarguments(method)
创建该类的实例。但是,在现代版本中,它还支持一种快捷方式表示法方法
,该方法也可以执行相同的操作。在这两种情况下,在刷新
中确实有一个类型为NoArguments
的对象,感谢您指出它确实是一个对象,而不仅仅是一个函数指针。