委托的问题

本文关键字:问题 | 更新日期: 2023-09-27 18:18:13

我是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);

委托的问题

看起来像是在调用一个标准的构造函数,但是c#编译器实际上对代码做了一些手工操作。当你写

MyDelegate myDelegate = new MyDelegate(MyMethod);

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

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

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

MyDelegate myDelegate = MyMethod;

至于为什么参数名是必需的,也许它们在一般情况下对编译来说不是严格必需的,但我怀疑CLR的设计者希望在运行时与其他特性保持一致。它允许你做一些事情,比如指定显式的参数名,否则你无法做到:

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

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

不完全回答你的问题,但只是让你知道,c#也支持Func委托。在这种情况下,你甚至不需要声明任何东西。

。此方法接受带有string类型参数和Int

输出的委托。
public static void DoSomethingWithDelegate(Func<string, Int32> converstionDelegate)
{
    int x = converstionDelegate("1");
}

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