一、泛型 核心概念
1. 什么是泛型
泛型 = 广泛的类型。
定义方法时不固定参数类型、不固定返回值类型,用占位符(T、T1、T2)代替。
在调用方法时,才动态指定具体类型 → 延迟指定类型。
2. 解决的问题(重点)
不用泛型:不同类型需要写多个重载方法,代码冗余、重复度高。
使用泛型:一个方法适配所有类型,极大简化代码、复用性极强。
二、泛型方法语法
1. 基础语法格式
cs
// T 为泛型占位符,可以自定义字母(T、T1、T2、V、W均可)
static 返回值 Test<T>(T 参数)
{
return 参数;
}
规则:方法名后加 <泛型占位符>,方法内所有 T 类型保持一致。
三、普通重载 VS 泛型方法(代码优化对比)
1. 传统写法:函数重载(冗余)
每种类型都要写一个方法,重复代码极多
cs
static int Test(int a)
{
return 10;
}
static string Test(string a)
{
return "ss";
}
2. 泛型写法:一个方法搞定所有类型(最优解)
cs
// T 代表任意类型,参数、返回值统一为T
static T Test<T>(T a)
{
return a;
}
3. 调用方式两种
cs
// 方式1:显式指定类型(完整写法)
Console.WriteLine(Test<int>(10));
Console.WriteLine(Test<string>("aa"));
Console.WriteLine(Test<bool>(true));
// 方式2:类型推断(简化写法,省略<>)
// 编译器自动根据传入参数,推断泛型类型
Console.WriteLine(Test(new string[] { "aa" }));
四、单泛型多参数(统一类型)
Test1<T>:两个参数、返回值全部为同一个类型T
cs
// 两个参数必须是相同类型
static T Test1<T>(T a, T b)
{
return b;
}
// 调用
Test1<int>(10, 20);
Test1(10, 20); // 类型推断简化
规则:同一个T,所有参数、返回值类型必须完全一致
五、多泛型参数(多个不同类型)
当方法需要传入两种不同类型 参数,使用多个泛型占位符 <T1,T2>
1. 无返回值双泛型方法
cs
static void Test2<T1, T2>(T1 a, T2 b)
{
}
// 调用:类型可以任意组合
Test2<int, string>(10, "aa");
Test2(10, new string[] { "aa" });
Test2(10, 10);
2. 泛型返回值 + 泛型数组参数
cs
// T1:返回值、第一个参数类型
// T2:数组参数类型
static T1 Test3<T1, T2>(T1 a, T2[] b)
{
return a;
}
// 调用
Test3<int, int>(10, new int[] { 1, 2, 3 });
Test3(10, new string[] { "aa" });
六、泛型方法两大调用方式(必考)
1. 显式调用
手动写 方法<类型>(参数),精准指定类型
2. 隐式调用(类型推断)
省略 <>,编译器根据传入参数自动匹配泛型类型,代码更简洁
七、泛型方法核心规则总结
-
泛型占位符
T/T1/T2只是类型占位,无固定含义 -
同一个占位符,类型必须统一
-
多个占位符
T1,T2支持传入不同类型参数 -
泛型延迟绑定:定义不指定类型,调用才确定类型
-
完美替代函数重载,减少大量重复代码
八、满分背诵口诀
-
泛型占位T,定义不定类型
-
调用传类型,延迟来绑定
-
单T类型全统一,多T类型可不同
-
可显可隐来调用,替代重载省代码