1

我有这些代码行。

class Program
{
    public delegate void printer();

    public static void Method()
    {
        Console.WriteLine("Hello");
    }
    static void Main(string[] args)
    {
        printer del = delegate { Method(); };
        del();
        Console.ReadKey();
    }
}

现在我怎么称呼这个声明printer del = delegate { Method(); };

当然它不能称为匿名方法,因为这里我有一个命名方法。

4

4 回答 4

9

它被称为匿名方法

当然不能称为匿名方法,因为这里我有一个命名方法

它仍然是一种匿名方法,正如@Daniel 在评论中指出的那样,您所做的是printer通过分配具有相同签名的方法(恰好是......匿名方法)来实例化委托的实例。您可以通过执行以下操作完全避免使用匿名方法:

Printer del = Method;
于 2012-12-03T15:37:00.723 回答
5

这是一个匿名委托,其唯一的功能恰好是调用命名方法。

于 2012-12-03T15:37:43.327 回答
1

正如其他人所说,这是一种匿名方法。

你也可以用这段代码完成同样的事情:

Action del = () => Method();
del();

这样,您不需要定义delegate和使用内置Action类型。

于 2012-12-03T15:39:20.653 回答
1

这是一种匿名方法。方法的内部确实调用了一个命名的方法,但这并没有改变外部方法是匿名的这一事实。

当您展开 del 时,您可以很容易地看到这一点:

class Program
{
    public delegate void printer();

    public static void MethodA()
    {
        Console.WriteLine("Hello");
    }

    public static void MethodB()
    {
        Console.WriteLine("World");
    }
    static void Main(string[] args)
    {
        bool x = true;

        printer del = delegate 
        {
            if (x)
            {
                MethodA();
            }
            else
            {
                MethodB();
            }
        };

        del();
        Console.ReadKey();
    }
}

如果你不想使用委托,你可以对 Action 做同样的事情:

   Action delA = () => MethodA();
   delA();

Action指向一个不带参数的 void 返回方法。

于 2012-12-03T15:40:56.253 回答