.NET(C#)中[匿名方法]的用处多(妙用)

在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法.通过使用匿名方法,由于您不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。有时匿名方法可以完成命名方法费好大的劲才能完成的功能。不过请注意匿名委托不能显式地有返回值,但是如果委托的签名有返回值的话,只要按照委托实际的签名在代码块中返回值就可以了。

    匿名方法的生命周期由于是局部范围内的这个缺点同时又是它的一个优点,可以方便地访问局部变量,而如果使用命名方法有时则会显得很麻烦。   

    现在举例如下说明:
    问题:要求返回在Windows Form窗体中所有不同类型控件的类型名称的集合
   思路:在Form类中有一个Controls集合,只要遍历Controls集合,得到把每个控件(Control),通过Control.GetType().ToString()就可以得到类型名称,可以把这个类型名称放在一个List<string>里面,每次加新控件前,查找一下这个控件类型名称集合里面是否已经存在,如果存在就不加入,如果不存在就加入.
  解决:
     声明List<string> listControlType = new List<string>();//存储控件类型名称的List<string>变量
     foreach(Control control in Controls)
     {
           string tmp = listControlType.Find(
                            delegate(string s){
                                    if(s == control.GetType().ToString())
                                            return true;
                                    else
                                            return false;
                            }
                    );

           if(tmp == default(string))
           {
              listControlType.Add(c.GetType().ToString());
           }
     }

    试想如果用命名方法来实现的话会很麻烦的.因为涉及到局部变量

    .注意上面的List<T>.Find()方法中的委托原型是这样的:
    public delegate bool Predicate<T>(T obj)
    在我上面的匿名委托中并没有显式地声明返回类型(编译器是不允许的,无法通过编译),但是要要保证匿名块中每条路径都返回 bool.

原文地址:https://www.cnblogs.com/mcjtcnblog/p/1359536.html