Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个委托方法在做什么?_C# - Fatal编程技术网

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
的对象,感谢您指出它确实是一个对象,而不仅仅是一个函数指针。