代码之家  ›  专栏  ›  技术社区  ›  kofucii

匿名方法参数的混淆

  •  9
  • kofucii  · 技术社区  · 14 年前

    在学习匿名方法时,我在互联网上发现了以下示例:

    namespace AnonymousMethods
    {
        public class MyClass
        {
            public delegate void MyDelegate(string message);  //delegate accepting method with string parameter
            public event MyDelegate MyEvent;
            public void RaiseMyEvent(string msg)
            {
                if (MyEvent != null) MyEvent(msg);
            }
        }
        class Caller
        {
            static void Main(string[] args)
            {
                MyClass myClass1 = new MyClass();
    
    // here the confusion
                myClass1.MyEvent += delegate
                {
                    Console.WriteLine("we don't make use of your message in the first handler");
                };
    
                myClass1.MyEvent += delegate(string message)
                {
                    Console.WriteLine("your message is: {0}", message);
                };
    
                Console.WriteLine("Enter Your Message");
                string msg = Console.ReadLine();
                myClass1.RaiseMyEvent(msg);
                Console.ReadLine();
            }
        }
    }
    

    我理解为什么这会奏效:

    myClass1.MyEvent += delegate(string message){
        Console.WriteLine("your message is: {0}", message); }
    

    但为什么这也起作用:

    myClass1.MyEvent += delegate {
        Console.WriteLine("we don't make use of your message in the first handler"); }
    

    当我们的代表被这样宣布时:

    public delegate void MyDelegate(string message);
    

    接受以字符串作为参数的方法。

    1 回复  |  直到 14 年前
        1
  •  14
  •   dtb    14 年前

    两者之间有区别

    delegate() { ...
    

    delegate { ...
    

    第一种是不带参数的匿名方法,而后者则完全忽略参数列表。在这种情况下,编译器会为您推断参数。当您实际上不需要参数值时,可以使用此表单。

    推荐文章