C# - 匿名代表

时间:2009-11-17 13:01:28

标签: c# delegates

与匿名方法一样,我宣布使用“delegate”关键字的代表是匿名代表吗?

namespace Test
{
    public delegate void MyDelegate();
    class Program
    {
        static void Main(string[] args)
        {
            DelegateTest tst = new DelegateTest();
            tst.Chaining();
            Console.ReadKey(true);
        }
    }

    class DelegateTest
    {
        public event MyDelegate del;

        public void Chaining()
        {
            del += delegate { Console.WriteLine("Hello World"); };
            del += delegate { Console.WriteLine("Good Things"); };
            del += delegate { Console.WriteLine("Wonderful World"); };
            del();
        }
    }
}

7 个答案:

答案 0 :(得分:23)

没有“匿名委托”这样的东西(或者更确切地说,这不是C#规范中的公认术语,或者我所知道的任何其他与.NET相关的规范)。

有匿名函数,包括匿名方法和lambda表达式。

您的代码显示了简单的旧匿名方法 - 尽管 使用一个功能,但lambda表达式没有:当您不关心它们时,根本不能表达参数。

答案 1 :(得分:19)

示例中的委托集合指向了许多匿名方法。委托是“只是方法指针”。如果它指向真实方法或匿名方法并不重要。

请参阅http://msdn.microsoft.com/en-us/library/0yw3tz5k(VS.80).aspx

答案 2 :(得分:4)

这是正确的,您已为事件分配了许多匿名方法。

如果你使用的是较新版本的c#,你也可以使用lambdas做类似的事情。例如:

class DelegateTest
{
    public event Action del;

    public void Chaining()
    {
        del += () => Console.WriteLine("Hello World");
        del += () => Console.WriteLine("Good Things");
        del += () => Console.WriteLine("Wonderful World");
        del();
    }
}

答案 3 :(得分:2)

是的,他们是匿名代表(或者更具体地说,delegates calling an anonymous method)。

答案 4 :(得分:2)

是。匿名委托不能直接通过名称引用,因此使用delegate(){}语法意味着它们是匿名的。

答案 5 :(得分:2)

您的代表不是匿名的。它被称为MyDelegate。 CLR中的委托是一个派生自System.MulticastDelegate的类,在您的情况下,它称为MyDelegate。 你无法直接从MulticastDelegate派生,C#编译器会阻止你。

在将代理分配给del的代码中,代理的类型/名称由编译器推断,因为您将del声明为MyDelegate类型的事件。

答案 6 :(得分:1)

他们是匿名方法的代表。这是制作匿名方法的一种方法,自.NET 2.0以来就可以使用。使用.NET 3.0,您还可以使用更简单的lambda表达式(但编译为相同的代码)。我想这就是你用“anonymouse方法”的意思。但实际上,它们是同一回事。