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

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

相关推荐
Lyra_Infra1 分钟前
故障排查报告:Spring boot连接 Nacos 异常及启动失败
java·spring boot
liguojun202510 分钟前
智慧文体旅系统选哪家?豆米跳跳十年技术沉淀支持源码交付
java·大数据·人工智能·物联网·1024程序员节
巴勒个啦11 分钟前
Vue 3.6 Vapor Mode 实战:我把一个 Vue3 项目的渲染性能提升了 4 倍
前端·angular.js
不简说12 分钟前
# JS 代码技巧 vol.7 — 20 个浏览器 API 实战,自带 API 能干的事别自己封装
前端·javascript·面试
CodexDave24 分钟前
数据库连接池耗尽:排查顺序与三层兜底
服务器·前端·数据库·git·云原生·容器·kubernetes
Hilaku28 分钟前
为什么 Cloudflare 能做到毫秒级冷启动,而其它云厂商却不行?
前端·javascript·程序员
2301_7944615736 分钟前
JavaScript 基础知识点详解
前端·javascript·html
HjhIron39 分钟前
在浏览器中跑DeepSeek-R1:用React+WebGPU实现端侧AI推理
前端·ai编程
学习使得吾快乐1 小时前
时序数据库 TDengine 在设备监测中的实际落地:从传感器上报到实时看板
java·时序数据库·tdenginne
geats人山人海1 小时前
c# 第九章 record
开发语言·c#