委托具有以下属性:
-
委托类似于 C++ 函数指针,但它们是类型安全的。
-
委托允许将方法作为参数进行传递。
-
委托可用于定义回调方法。
-
委托可以链接在一起;例如,可以对一个事件调用多个方法。
-
方法不必与委托类型完全匹配。 有关详细信息,请参阅在委托中使用变体(C# 和 Visual Basic)。
-
C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递来代替单独定义的方法。 C# 3.0 引入了 Lambda 表达式,利用它们可以更简练地编写内联代码块。 匿名方法和 Lambda 表达式(在某些上下文中)都可编译为委托类型。 这些功能现在统称为匿名函数。 有关 lambda 表达式的更多信息,请参见 匿名函数(C# 编程指南)。
1 private void btnOpen_Click(object sender, EventArgs e) 2 { 3 4 5 Func<int, bool> t1 = testa;//注册方法只写方法名,不写参数。。。 6 7 int[] i = { 1, 2,5 }; 8 int j=i.Count(t1); 9 10 int h = i.Count(n=>n%2==0);//等效 11 12 MessageBox.Show(j.ToString()); 13 } 14 15 private bool testa(int a) 16 { 17 return a%2==0; 18 }
代码解读(个人理解):
一个int型数组有一个扩展方法Count<>,参数接收的是一个public delegate TResult Func<in T, out TResult>(T arg) 类型的委托 ;
代码第5行定义了一个Func<int, bool> t1 委托,并给t1注册了方法testa;
代码第8行把t1做为参数传递给Count方法,Count把数组的每个元素做为t1的参数执行后,返回所有为true的总数;
第10行是用lambda表达式方式,省去了定义委拖对象和方法,系统会将表达式做类型转换和参数类型推断;