为更好理解委托、Lambda表达式、Func, 编写了下面例子。例子中的1——8输出都是相同的,功能也相同。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Model { class CaiTest { //定义委托. 1,2,3,4,5,6 都要用到 delegate string delCompare(int a); // 1.普通委托 public void Delegate_test(string[] args) { delCompare hander = DelegateMethod; Console.WriteLine(hander(102)); } public static string DelegateMethod(int a) { double s=2*a; return s.ToString(); } //2. 匿名委托 public void Delegate_test2(string[] args) { delCompare del = delegate(int a) { return (2*a).ToString(); }; Console.WriteLine(del(102)); } //3. lambda表达式:隐式类型=>表达式 public void lambda_test(string[] args) { delCompare del = a => (2*a).ToString(); Console.WriteLine(del(102)); } //4. lambda表达式: 隐式类型=>语句块 public void lambda_test2(string[] args) { delCompare del = a => { return (2 * a).ToString(); }; Console.WriteLine(del(102)); } //5. lambda表达式:显式类型=>表达式 public void lambda_test3(string[] args) { delCompare del = (int a) => (2 * a).ToString(); Console.WriteLine(del(102)); } //6. lambda表达式: 显式类型=>语句块 public void lambda_test4(string[] args) { delCompare del = (int a) => { int s = 2 * a; return s.ToString(); }; Console.WriteLine(del(102)); } //--------------------------- //7. Func<T1..TResult>,没有用到delegate,相当于直接调用了一个静态方法,理论上比delegate在时间和空间的效率都要高 public void func_test(string[] args) { Func<int, string> del = a => (2 * a).ToString(); Console.WriteLine(del(102)); } //8. Expression(TDelegate),语言级别的,用于动太生成表达式,理论上Expression(TDelegate)效率最差 public void expression_test(string[] args) { System.Linq.Expressions.Expression<Func<int, string>> exp = a => (2 * a).ToString(); //生成表达式 Func<int,string> fun = exp.Compile(); //编译表达式 fun(102); //执行表达式 } } }