C#的匿名方法

没有匿名方法的时候(C# 1.0)

addButton.Click += new EventHandler(AddClick);

void AddClick(object sender,EventArgs e)
{
   listBox.Items.Add(textBox.Text);
}

有了匿名方法之后(C# 2.0)

addButton.Click += delegate
{
   listBox.Items.Add(textBox.Text);
}

C# 支持用于调用一个或多个方法的委托 (delegate)。委托提供运算符和方法来添加或删除目标方法,它也可以在整个 .NET 框架中广泛地用于事件、回调、异步调用、多线程等。

常规委托:

class SomeClass
{
   delegate void SomeDelegate();
   public void InvokeMethod()
   {
      SomeDelegate del = new SomeDelegate(SomeMethod);     
      del();
   }
   void SomeMethod()  
   {     
      MessageBox.Show("Hello");
   }
}

可以用一个匿名方法来定义和实现这个方法:

class SomeClass
{
   delegate void SomeDelegate();
   public void InvokeMethod()
   {
      SomeDelegate del = delegate()
                         {
                             MessageBox.Show("Hello");
                         };
      del();  
   }
}

匿名方法当做参数传入:
class SomeClass
{
   delegate void SomeDelegate();
   public void SomeMethod()  
   {     
      InvokeDelegate(delegate(){MessageBox.Show("Hello");});  
   }  
   void InvokeDelegate(SomeDelegate del)  
   {     
      del();  
   }
}

下面是一个将匿名方法作为参数传递的具体而实用的示例,它在没有显式定义 ThreadStart 委托或线程方法的情况下启动一个新的线程:

           public class MyClass

           {

               public void LauchThread()

               {

                   Thread workerThread = new Thread(delegate()

                                         {

                                             MessageBox.Show("Hello");

                                         });

                   workerThread.Start();

               }

           }


带参数的匿名方法:

class SomeClass
{
   delegate void SomeDelegate(string str);
   public void InvokeMethod()
   {
      SomeDelegate del = delegate(string str)
                         {
                             MessageBox.Show(str);
                         };
      del("Hello");  
   }
}


一般的匿名方法:
class SomeClass<T>
{  
   delegate void SomeDelegate(T t);  
   public void InvokeMethod(T t)  
   {     
      SomeDelegate del = delegate(T item){...}   
      del(t);  
   }
}

注意点:

1.如果匿名方法没有参数,则可以在 delegate 关键字后面使用一对空括号:

class SomeClass
{
delegate void SomeDelegate();
public void InvokeMethod()
{
SomeDelegate del = delegate()
{
MessageBox.Show("Hello");
};
del();
}
}

2.如果您将 delegate 关键字与后面的空括号一起忽略,则您将定义一种特殊的匿名方法,它可以指派给具有任何签名的任何委托:class SomeClass
{
   delegate void SomeDelegate(string str);
   public void InvokeMethod()
   {
      SomeDelegate del = delegate                        
                         {
                             MessageBox.Show("Hello");
                         };
      del("Parameter is ignored");  
   }
}

原文地址:https://www.cnblogs.com/chencidi/p/1905389.html