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

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

相关推荐
风吹夏回1 小时前
Vue3 + Element Plus 完整使用指南
前端·javascript·vue.js·element
中草药z1 小时前
【RAG】工程化实战:全链路原理复盘 + 方案选型 + 实战高阶玩法
java·深度学习·机器学习·阿里云·rag·springai
学计算机的计算基1 小时前
MySQL 性能调优面试复习:Explain、索引、慢查询、缓存和架构优化
java·数据库·笔记·mysql
Hillain1 小时前
软件设计师设计模式
java·开发语言·经验分享·笔记·算法·设计模式·软考
依托偶尔宁1 小时前
element-plus:el-table设置展开图标所在列的位置
前端·elementui
摇滚侠1 小时前
Spring 零基础入门到进阶 IOC 概述 11 - 13
java·后端·spring
李少兄1 小时前
Spring Boot Test 启动类自动发现机制解析与工程实践
java·spring boot·后端
码云骑士1 小时前
【1.2Java基础】Win10环境变量配置详解-从原理到排雷
android·java
小小龙学IT1 小时前
Go语言后端开发实战指南:构建高性能云原生服务
前端·云原生·golang