C#泛型方法详解(附带实例)
泛型的概念是用通用类型代表所有可能的数据类型,C# 程序中习惯上用尖括号“<>”内放置 T 来表示,如下:
【实例 1】演示泛型方法。
设计泛型函数时,我们使用尖括号 <>,内含大写英文字母 T,来作为泛型数据类型,T 有 Type 的意思,所以程序设计师喜欢用T来作为泛型的数据类型,其实我们也可以使用其他字母替换,下表是常见的泛型英文字母:
当然也可以不使用其他英文字母,,笔者使用 U 当作泛型数据类型的定义,执行结果与实例 1 相同,如下所示:
【实例 2】设计泛型函数,传递来的参数是泛型数组,这个函数可以输出数组内容,此程序实例会用整型数组与字符串数组进行测试。
<T>
然后我们可以针对这个通用类型设计相关数据类型的变量,将泛型应用到方法(或函数)中,基础语法如下:存取运算符 函数类型 函数名称<T>(T 参数名称) { ... }程序设计的术语称上述是泛型方法,上述方法名称后面加上 <T>,是在标记这是泛型函数,有了这个定义后,函数的类型参数就可以使用泛型参数,详情可以参考下列实例。
【实例 1】演示泛型方法。
void Swap<T>(ref T x, ref T y) { T tmp; tmp = x; x = y; y = tmp; } int x1 = 5; int x2 = 1; Console.WriteLine($"对调用前 x1 = {x1} \t x2 = {x2}"); Swap<int>(ref x1, ref x2); Console.WriteLine($"对调用后 x1 = {x1} \t x2 = {x2}"); char ch1 = 'a'; char ch2 = 'b'; Console.WriteLine($"对调用前 ch1 = {ch1} \t ch2 = {ch2}"); Swap(ref ch1, ref ch2); Console.WriteLine($"对调用后 ch1 = {ch1} \t ch2 = {ch2}");执行结果为:
对调用前 x1 = 5 x2 = 1
对调用后 x1 = 1 x2 = 5
对调用前 ch1 = a ch2 = b
对调用后 ch1 = b ch2 = a
Swap<int>(ref x1, ref x2);这表示告诉编译程序参数使用 int 类型调用此程序第 1 行的 Swap()<T> 函数。第 12 行中的 <int>可以省略,所以也可以用下列方式调用 Swap<T>():
Swap(ref x1, ref x2);这时编译程序会根据传递来的参数推断调用 Swap()<T> 方法的数据类型。第 18 行所传递的是 char 数据类型,就是采用省略 <char> 方式调用,如下:
Swap(ref ch1, ref ch2);编译程序会根据参数类型推断需要调用 Swap()<T> 的方法。
设计泛型函数时,我们使用尖括号 <>,内含大写英文字母 T,来作为泛型数据类型,T 有 Type 的意思,所以程序设计师喜欢用T来作为泛型的数据类型,其实我们也可以使用其他字母替换,下表是常见的泛型英文字母:
- E: Element;
- K: Key;
- N: Number;
- V: Value。
当然也可以不使用其他英文字母,,笔者使用 U 当作泛型数据类型的定义,执行结果与实例 1 相同,如下所示:
void Swap<U>(ref U x, ref U y) { U tmp; tmp = x; x = y; y = tmp; }从上述实例我们可以体会到泛型有一个最大的优点是,可以重复使用代码,提高程序撰写的效率。
【实例 2】设计泛型函数,传递来的参数是泛型数组,这个函数可以输出数组内容,此程序实例会用整型数组与字符串数组进行测试。
void PrintArray<T>(T[] arr) { foreach (var item in arr) { Console.WriteLine(item); } } int[] x = { 5, 7, 9 }; PrintArray(x); string[] str = { "C#", "Python", "Java" }; PrintArray(str);执行结果为:
5
7
9
C#
Python
Java