首页 > 技术文章 > c#中的泛型、委托、泛型委托、Action和Func及使用场景系列之三:泛型和委托的补充介绍及匿名方法和lamda表达式

pfm33 2020-12-14 22:12 原文

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         }

 

推荐阅读