C# 泛型方法

一、泛型 核心概念

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类型可不同

  • 可显可隐来调用,替代重载省代码

相关推荐
用户3126874877204 分钟前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
小小小小宇8 分钟前
Pi 手动添加
前端
vipxieliang14 分钟前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing15 分钟前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
然我19 分钟前
模型不是 Agent:从零实现一个最小 Agent Loop
前端·人工智能·agent
boooooooom26 分钟前
手把手做一个图 RAG 烹饪问答系统:Neo4j + Milvus + LLM 的工程实践
前端·javascript·后端
小小善后师27 分钟前
HID 设备对接技术解析:基于本地中间服务的 WebSocket 通信模式
前端
黄油面包29 分钟前
Codex 额度三天见底后,我重新做了一周预算
前端·人工智能
PedroQue9932 分钟前
v2.7.1:修复 H5 端返回死循环闪烁问题
前端·uni-app
coderCN33 分钟前
Nodejs express+knex(ORM框架)
前端·node.js