|
[匿名方法]的用处多(妙用)
在 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.
这是我附件中的一段代码,注意附件中的程序运行后最小到了系统托盘,请从系统托盘图标打开主界面,从主界面的组合框中可以看到运行效果 |
|