手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

C#学习笔记之泛型-泛型方法

时间:2024-10-21 15:33:18

1、首先来看一下如何定义泛型方法,Swap<T>()方法把T定义为泛型类型,该泛型类型用于两个参数和一个变量temp:如下图所示:把泛型类型赋予方法调用,就可以调用泛型方法:int i=4;int j=5;Swap<int>(ref i,ref j);但是,因为C#编译器会通过调用Swap()方法来获取参数的类型,所以不需要把泛型类型赋予方法调用,泛型方法可以像非泛型方法这样调用:int i=4;int j=5;swap(ref i,ref j);

C#学习笔记之泛型-泛型方法

2、泛型方法示例:下面给出个例子,用泛型方法累加集合中的所有元素。为了说明泛型方法的功能,下面使用包含Name和Balance属性的Account类:

C#学习笔记之泛型-泛型方法

3、其中累加余额的所有账户操作都添加到List<Account>类型的账户列表中:var account=new List<Account>(){new Account("1",1000);new Account("2",3000);new Account("3",4000);new Account("4",4000);};累加所有Account对象的表达式用foreach语句遍历所有的Account对象,如下图所示。foreach语句使用IEnumerable接口迭代集合的元素,所以AccumulateSimple()方法的参数是IEnumerable类型。

C#学习笔记之泛型-泛型方法

4、带约众龊受礻束的泛型方法:第一个实现的问题是,它只能用于Account对象,使用泛型方法就可以避免这个问题。Account()方法的溟猫钽吟第二个版本接受实现了IAccount接口的任意类型。如前面的泛型类所述,泛型类型可以用where子句来限制。用于泛型类型的这个子句也可以用泛型方法。Accumulate()方法的参数改为IEnumerable<T>。IEnumuerable<T>是泛型集合类实现的泛型接口将Account类型定义为泛型类型参数,就可以调用新的Accumulate()方法:decimal amount=Algorithm.Accumulate<Account>(accounts);因为编译器会从方法的参数类型中自动推断出泛型类型参数,所以如下方式调用也是正确的:decimal amount=Algorithm.Accumulate(accounts);

C#学习笔记之泛型-泛型方法

5、带委托的泛型方法:泛型类型实现Iaccount接口的要求过于严格,下面的示例提示了,如何通过传递一个泛锸责氧铼型委托来修改Accumulate()方法。这个Accumulate()方法使用两个泛型参数T1和T2。第一个参数T1用于实现IEnumerable<T1>参数的集合,第二个参数使用泛型委托Fun<T1,T2,TResult>.其中,第二个和第三个泛型参数都是T2的类型。需要传递的方法有两个输入参数(T1和T2)和一个T2类型的返回值,如下所示:调用该方法时,需要指定泛型参数类型,因为编译器不能自动推断出该类型:decimal amount=Algorithms.accumulateSimple<Account,decimal>(accounts,(item,sum))=>sum+=item.Balance;

C#学习笔记之泛型-泛型方法

6、泛型方法规范:泛型方法可以重载,为特定的类型定义规范。这也适用于带泛型参数的方法。Foo()方法定义了4个版本,第一个版本接受一个泛型参数,第二个版本适用于int参数的专用版本,第三个Foo方法接受两个泛型参数,第四个版本是第三个版本的专用版本,其第一个参数是int类型,在编译期间,会使用最佳匹配。如果传递了int,就选择带int的方法。对于任何其他参数类型,编译器会选择方法的泛型版本:

C#学习笔记之泛型-泛型方法
© 手抄报圈