C# 泛型方法概念及使用浅析

开发 后端
C# 泛型方法是什么呢?C# 泛型方法使用的范围以及具体的应用实例是什么呢?这些都将在本文中向你一一介绍。

C# 泛型方法在相同的类型推断规则也适用于静态方法以及实例方法。编译器能够根据传入的方法参数推断类型参数;它无法仅从约束或返回值推断类型参数。因此,类型推断不适用于没有参数的方法。类型推断在编译时、编译器尝试解析任何重载方法签名之前进行。编译器向共享相同名称的所有泛型方法应用类型推断逻辑。在重载解析步骤中,编译器仅包括类型推断取得成功的那些泛型方法。

在泛型类中,非泛型方法可以访问类级别类型参数,如下所示:

C# 泛型方法代码

  1. class SampleClass<T>  
  2. {  
  3.     void Swap(ref T lhs, ref T rhs) { }  

如果定义的泛型方法接受与包含类相同的类型参数,编译器将生成警告 CS0693,因为在方法范围内,为内部 T 提供的参数将隐藏为外部 T 提供的参数。除了类初始化时提供的类型参数之外,如果需要灵活调用具有类型参数的泛型类方法,请考虑为方法的类型参数提供其他标识符,如下面示例中的 GenericList2<T> 所示。

C# 泛型方法代码

  1. class GenericList<T>  
  2. {  
  3.     // CS0693  
  4.     void SampleMethod<T>() { }  
  5. }  
  6.  
  7. class GenericList2<T>  
  8. {  
  9.     //No warning  
  10.     void SampleMethod<U>() { }  
  11. }  

使用约束对方法中的类型参数启用更专门的操作。此版本的 Swap<T> 现在称为 SwapIfGreater<T>,它只能与实现 IComparable<T> 的类型参数一起使用。

C# 泛型方法代码

  1. void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>  
  2. {  
  3.     T temp;  
  4.     if (lhs.CompareTo(rhs) > 0)  
  5.     {  
  6.         temp = lhs;  
  7.         lhs = rhs;  
  8.         rhs = temp;  
  9.     }  

泛型方法可以使用许多类型参数进行重载。例如,下列方法可以全部存在于同一个类中:

C# 泛型方法代码

  1. void DoWork() { }  
  2. void DoWork<T>() { }  
  3. void DoWork<T, U>() { } 

泛型方法是使用类型参数声明的方法,如下所示:

C# 泛型方法代码

  1. static void Swap<T>(ref T lhs, ref T rhs)  
  2. {  
  3.     T temp;  
  4.     temp = lhs;  
  5.     lhs = rhs;  
  6.     rhs = temp;  

下面的代码示例演示一种使用 int 作为类型参数的方法调用方式:

C# 泛型方法代码

  1. public static void TestSwap()  
  2. {  
  3.     int a = 1;  
  4.     int b = 2;  
  5.  
  6.     Swap<int>(ref a, ref b);  
  7.     System.Console.WriteLine(a + " " + b);  

也可以省略类型参数,编译器将推断出该参数。下面对 Swap 的调用等效于前面的调用:

C# 泛型方法代码

  1. Swap(ref a, ref b);  

C# 泛型方法的相关内容就向你介绍到这里,希望对你了解和学习C# 泛型方法有所帮助。

【编辑推荐】

  1. C# 泛型类概念与实例的理解应用浅析
  2. C# 泛型的优点浅谈
  3. C# 泛型类型参数浅析
  4. C# 类型参数约束分析及应用浅析
  5. C# 泛型接口应用浅析
责任编辑:仲衡 来源: MSDN
相关推荐

2009-08-24 17:39:21

C# 泛型集合

2009-09-09 16:46:59

C# XmlSeria

2009-08-24 16:19:42

C# 泛型方法

2009-08-20 18:47:19

C#异步通信

2009-08-18 09:51:18

C#枚举类型

2009-08-24 15:12:13

C# 泛型接口

2009-08-24 18:15:24

C# Dictiona

2009-08-24 14:51:25

C# 泛型泛型类型

2009-08-24 14:26:42

C# 泛型类

2009-08-27 10:20:03

C# foreach语

2009-08-24 17:27:05

C#泛型应用

2009-08-24 17:58:19

C# 泛型集合

2009-08-24 16:39:19

C# 泛型应用

2009-08-24 14:20:13

C# 强制类型转换

2009-08-24 15:50:23

C# 泛型C# 泛型委托

2009-08-24 11:35:20

C# 泛型应用

2009-09-01 16:10:28

C#单元测试

2009-08-24 10:29:39

C# 泛型

2009-08-24 10:37:27

C# 泛型

2009-08-24 13:31:38

C# 泛型约束
点赞
收藏

51CTO技术栈公众号