在. net3. 5里面 , 委托的定义和实现被大大的简化了!使用关键字Func或Action就可以定义一个委托 , 使用拉姆达表达式就可以实现一个具体的委托.
Func关键字是用来定义一个有返回值的委托 , 它一共有五个重载 , 我们介绍其中的三个
1 public delegate TResult Func<TResult>();
这表示一个没有参数 , 只有一个返回值的委托 , 返回值的类型就是TResult(泛型)
代码 1 public class test 2 { 3 /// <summary> 4 /// 定义一个委托 5 /// </summary> 6 public Func<string> _GetName; 7 /// <summary> 8 /// 一个普通的没有参数 , 有返回值的方法 9 /// </summary> 10 /// <returns></returns> 11 public string GetName() 12 { 13 return "张三"; 14 } 15 public void Main() 16 { 17 //3. 5以前的委托的实现 , 直接赋值 18 _GetName = GetName; 19 20 //拉姆达表达式的实现方法 21 _GetName = ( 22 () //因为这个委托没参数 , 所以参数列表没有东西 23 = > //拉姆达表达式的符号 24 { //大括号的代码段表示具体的委托的实现 25 return "还是张三"; 26 }); 27 //拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return 则可以省略代码段最外面的大括号 , 和return关键字 28 _GetName = () = > "总是张三"; 29 //调用 30 string MyName = _GetName(); 31 } 32 }
2 public delegate TResult Func<T , TResult>(T arg);
这表示有且仅有一个参数 , 并且有返回值的委托.
代码 1 public class test 2 { 3 /// <summary> 4 /// 定义一个委托 , 有一个参数和一个返回值 5 /// </summary> 6 public Func<string , string> _GetName; 7 /// <summary> 8 /// 有一个参数的方法 9 /// </summary> 10 /// <param name = "strName">这是一个参数!</param> 11 /// <returns>这是一个返回值</returns> 12 public string GetName(string strName) 13 { 14 return strName; 15 } 16 public void Main() 17 { 18 //3. 5以前的委托的实现 , 直接赋值 19 _GetName = GetName; 20 21 //拉姆达表达式的实现方法 22 _GetName = ( 23 (S) //有一个参数!所以参数列表里面有一个东西 , 这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范 24 = > //拉姆达表达式的符号 25 { //大括号的代码段表示具体的委托的实现 26 return "还是" + S; 27 }); 28 //拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return 则可以省略代码段最外面的大括号 , 和return关键字 29 _GetName = (abc) = > "总是" + abc; 30 //调用 31 string MyName = _GetName("张三"); 32 } 33 }
3 public delegate TResult Func<T1 , T2 , TResult>(T1 arg1 , T2 arg2);
这表示有且仅有两个参数 , 并且有返回值的委托.
代码 1 public class test 2 { 3 /// <summary> 4 /// 定义一个委托 , 有一个参数和一个返回值 5 /// </summary> 6 public Func<string , int , string> _GetName; 7 /// <summary> 8 /// 这是一个有两个参数的方法 , 方法的参数类型的顺序必须和委托的参数类型顺序一致 9 /// </summary> 10 /// <param name = "strName">第一个是字符类型</param> 11 /// <param name = "intAGE">第二个是整形 , 请不要颠倒类型!</param> 12 /// <returns>返回一个字符串 , 对应委托的最后一个参数</returns> 13 public string GetName(string strName , int intAGE) 14 { 15 return string. Format("{0}的年龄是{1}岁" , strName , intAGE); 16 } 17 public void Main() 18 { 19 //3. 5以前的委托的实现 , 直接赋值 20 _GetName = GetName; 21 22 //拉姆达表达式的实现方法 23 _GetName = ( 24 (S , W) //有一个参数!所以参数列表里面有一个东西 , 这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范 25 = > //拉姆达表达式的符号 26 { //大括号的代码段表示具体的委托的实现 27 return string. Format("{0}的年龄是{1}岁" , S , W); 28 }); 29 //拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return 则可以省略代码段最外面的大括号 , 和return关键字 30 _GetName = (abc , efd) = > string. Format("{0}的年龄是{1}岁" , abc , efd); 31 //调用 32 string MyName = _GetName("张三" , 33); 33 } 34 }
Action关键字用来定义一个没有返回值的方法 , 它有一个非泛型方法 , 和四个泛型方法 , 一共五种. Action和func的区别就在于一个没有返回值 , 一个有返回值!其他的都一样!就好像VB的sub和function一样!
1 public delegate void Action();没有参数也没有返回值
代码 1 public class test 2 { 3 /// <summary> 4 /// 定义一个委托 , 没有返回值也没有参数 5 /// </summary> 6 public Action _GetName; 7 8 public void GetName() 9 { 10 System. Windows. Forms. MessageBox. Show("没有参数也没有返回值 , 我只要自己显示了!"); 11 } 12 public void Main() 13 { 14 //3. 5以前的委托的实现 , 直接赋值 15 _GetName = GetName; 16 17 //拉姆达表达式的实现方法 18 _GetName = ( 19 () 20 = > //拉姆达表达式的符号 21 { //大括号的代码段表示具体的委托的实现 22 System. Windows. Forms. MessageBox. Show("没有参数也没有返回值 , 我只要自己显示了!"); 23 }); 24 //因为action没有返回值 , 所以下面的简写方式是错误的 25 //_GetName = () = > System. Windows. Forms. MessageBox. Show("没有参数也没有返回值 , 我只要自己显示了!"); 26 //调用 27 _GetName(); 28 } 29 }
2 public delegate void Action<T>(T obj);
代码 1 public class test 2 { 3 /// <summary> 4 /// 定义一个委托 , 没有返回值也没有参数 5 /// </summary> 6 public Action<bool> _GetName; 7 8 public void GetName(bool blnShow) 9 { 10 if (blnShow) 11 { 12 System. Windows. Forms. MessageBox. Show("要我显示就显示 , 多没面子"); 13 } 14 else 15 { 16 System. Windows. Forms. MessageBox. Show("不要我显示 , 我偏要显示"); 17 } 18 } 19 public void Main() 20 { 21 //3. 5以前的委托的实现 , 直接赋值 22 _GetName = GetName; 23 24 //拉姆达表达式的实现方法 25 _GetName = ( 26 (b) 27 = > //拉姆达表达式的符号 28 { //大括号的代码段表示具体的委托的实现 29 if (b) 30 { 31 System. Windows. Forms. MessageBox. Show("要我显示就显示 , 多没面子"); 32 } 33 else 34 { 35 System. Windows. Forms. MessageBox. Show("不要我显示 , 我偏要显示"); 36 } 37 }); 38 39 _GetName(true); 40 } 41 }
有一个参数但没有返回值