找回密码
 注册
搜索
热搜: java php web
查看: 354|回复: 0

[匿名方法]的用处多(妙用)

[复制链接]
发表于 2009-1-27 23:33:54 | 显示全部楼层 |阅读模式
[匿名方法]的用处多(妙用)
在 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.
    这是我附件中的一段代码,注意附件中的程序运行后最小到了系统托盘,请从系统托盘图标打开主界面,从主界面的组合框中可以看到运行效果
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|软晨网(RuanChen.com)

GMT+8, 2024-11-22 18:33

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表