首页 > 编程笔记 > C#笔记 阅读:10

C#泛型方法详解(附带实例)

泛型的概念是用通用类型代表所有可能的数据类型,C# 程序中习惯上用尖括号“<>”内放置 T 来表示,如下:

<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

从上述第 12 行可以看到调用 Swap()<int> 函数如下:
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来作为泛型的数据类型,其实我们也可以使用其他字母替换,下表是常见的泛型英文字母:
当然也可以不使用其他英文字母,,笔者使用 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

相关文章