代表问题

时间:2013-06-13 03:38:50

标签: c# constructor delegates

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

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时,为什么我们需要给出参数名称?在C ++中,我们可以在类中执行类似的操作:

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

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:1)

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

e.g。此方法接受一个委托,其参数类型为string,输出为Int

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

在此处详细了解:http://msdn.microsoft.com/en-us/library/bb549151.aspx