3

我是 C# 新手,有两个关于delegates 的问题。

MSDN显示Delegate该类只有两个构造函数,每个构造函数都有两个参数。然而,在下面的程序中,我Delegate用一个看似单参数的构造函数来实例化一个对象(见注释行)。

using System;

static class Program
{
    public delegate void MyDelegate();

    static void MyMethod()
    {
        Console.WriteLine("I'm inside MyMethod!");
    }

    static void Main()
    {
        MyDelegate myDelegate = new MyDelegate(MyMethod); // Constructor Call
        myDelegate();
    }
}

我是不是误会了什么?

我的第二个问题是:在声明delegate一个或多个参数的 s 时,为什么我们需要给参数命名?在 C++ 中,我们可以在类中做这样的事情:

public delegate void MyOtherDelegate(int, int, string);
4

2 回答 2

2

看起来您正在调用标准构造函数,但 C# 编译器实际上对您的代码做了一些处理。当你写

MyDelegate myDelegate = new MyDelegate(MyMethod);

您实际上并没有直接调用 MSDN 上列出的任何构造函数。它改为调用编译器在委托类型上自动定义的MyDelegate构造函数(这些构造函数未在 MSDN 上显示)。事实上,MSDN 上列出的构造函数甚至不能直接调用:

此构造函数不能在应用程序代码中使用。要通过指定实例方法的名称来创建委托,请使用方法的重载CreateDelegate...

值得注意的是,为了简洁起见,您甚至可以这样做:

MyDelegate myDelegate = MyMethod;

至于为什么参数名称是必要的,也许它们对于一般的编译可能不是绝对必要的,但我怀疑 CLR 的设计者希望与运行时的其他特性保持一致。它允许您执行诸如指定显式参数名称之类的事情,否则您将无法做到:

Func<int, int> foo = x => x + 1;
foo(arg: 1);

这也意味着您可以通过反射检查参数名称,并可能对它们进行一些有用的处理。

于 2013-06-13T04:06:16.077 回答
1

不完全回答您的问题,但您知道,C# 还支持 Func 委托。在这种情况下,您甚至不需要声明任何内容。

例如,此方法接受带有字符串类型参数和 Int 输出的委托

public static void DoSomethingWithDelegate(Func<string, Int32> converstionDelegate)
{
    int x = converstionDelegate("1");
}

在此处阅读更多信息:http: //msdn.microsoft.com/en-us/library/bb549151.aspx

于 2013-06-13T04:06:08.867 回答