这个委托方法在做什么?

时间:2013-07-09 03:57:10

标签: c#

我一直在阅读代表们的MSDN page,看起来很简单。然后我看了一些使用它们的代码,我看到了:

 public delegate void NoArguments();
 public NoArguments Refresh = null;
 Refresh = new NoArguments( Reset );

第三行令我困惑。你怎么能new代表?它不是一个对象,它是一个方法,或者更确切地说是一个方法的委托。根据MSDN页面上的示例,创建委托实例是通过简单的分配,而不是分配。此外,当委托声明不带参数时,为什么委托的new采用参数Reset

3 个答案:

答案 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的类,有多种方法(InvokeBeginInvokeEndInvoke )。

由于历史原因,C#允许您使用new NoArguments(method)创建该类的实例。但是在现代版本中,它还支持快捷符号method,它可以执行相同的操作。在这两种情况下,您实际上在NoArguments中都有Refresh类型的对象。

相关问题