c#中的泛型、委托、泛型委托、Action和Func及使用场景系列之三:泛型和委托的补充介绍及匿名方法和lamda表达式
1 . 泛型可以让多个类型共享一组代码,使用场景:同一组操作作用于不同类型的时候 。
2 . 委托可以持有一个或多个有相同签名的方法,使用场景:对值/对象做一个/多个不同操作的时候。
-----------------------------------------------------------------------------------------
一、泛型的约束:
泛型约束是指对泛型的类型参数做某些限制,泛型有5种约束,如下表:
约束类型 | 描述 |
类名 | 只有该类或其派生类能用作类型实参 |
class | 只有引用类型可以用作类型实参 |
struct | 只有值类型可以用作类型实参 |
接口名 | 只有该接口或实现了该接口的类型可以用作类型实参 |
new() | 只有无参公共构造函数的类型可以用作类型实参 |
如果有多个类型或多个约束应遵循如下的规则:
1 . 最多只能有一个主约束,且放在第一位。
2 . 可以有多个接口名约束。
3 . 构造函数约束要放在最后。
下面的代码分别展示了以上情况:
1 public class Class11<T1, T2, T3, T4, T5, T6> 2 where T1: MyClass //类名约束 3 where T2: IComparable, ICloneable //接口名约束 4 where T3: class //引用类型约束 5 where T4: struct //值类型约束 6 where T5: new() //构造函数约束 7 { 8 //... 9 }
二、委托的调用、匿名方法和lamda表达式
1 . 上一篇的例子只演示了委托变量拥有一个方法的情况,如果要拥有多个方法,可以用下面的方式:
1 public class Class22 2 { 3 //1. 将两个委托组合成一个委托 4 public void Test1() 5 { 6 MyDelegate delegate1, delegate2, delegate3; 7 delegate1 = instance1.MyFunc; 8 delegate2 = class1.MyFunc; 9 delegate3 = delegate1 + delegate2; 10 } 11 12 //2. 给委托添加/移除方法 13 public void Test2() 14 { 15 MyDelegate delegate1; 16 delegate1 = instance1.MyFunc; 17 delegate1 += class1.MyFunc; 18 delegate1 -= instance1.MyFunc; 19 } 20 }
2 . 委托的两种调用方式
1 public void Test3() 2 { 3 MyDelegate delegate1; 4 delegate1 = Class6.NotifyXml; 5 6 //方式一:用委托变量来调用委托 7 delegate1("100","SUCCESS"); 8 9 //方式二:用Invoke方法来调用委托 10 delegate1.Invoke("100", "SUCCESS"); 11 }
3 . 匿名方法和lamda表达式
给委托变量赋值时的方法如果只会被使用一次可以用匿名方法或lamda表达式,如下:
1 public void Test4() 2 { 3 MyDelegate delegate1; 4 5 //匿名方法,方法名用关键字delegate表示 6 delegate1 = delegate (string code, string msg) 7 { 8 return "code=" + code + "&msg=" + msg; 9 }; 10 11 //lamda表达式,没有方法名,用=>符号指向方法体 12 delegate1 = (string code, string msg)=> 13 { 14 return "code=" + code + "&msg=" + msg; 15 }; 16 17 }