当前位置: 首页 > news >正文

C# 泛型详解:从入门到掌握 Generics,写出高复用、高性能代码

在 C# 开发过程中,我们经常会遇到这样的问题:

同样的功能,只是数据类型不同,却需要重复编写大量代码。

例如:

  • 一个方法处理 int 类型
  • 一个方法处理 string 类型
  • 一个方法处理 double 类型

有没有一种方式,可以让代码“一次编写,多种类型复用”?

答案就是:

泛型(Generic)

泛型是 C# 中非常重要的高级特性,也是现代 .NET 开发的基础。

你每天使用的:

List<T> Dictionary<TKey,TValue> IEnumerable<T> Task<T> Func<T> Action<T>

全部建立在泛型基础之上。

掌握泛型,是从C# 入门开发者迈向高级开发者的重要一步。


一、什么是 C# 泛型?

1.1 泛型的定义

泛型(Generics)是一种类型参数化技术

简单来说:

泛型允许我们在定义类、方法、接口时,不提前指定具体的数据类型,而是在使用时再确定类型。

例如:

List<int> List<string> List<double>

这里:

T = int T = string T = double

T就代表一个未知类型。


二、为什么需要泛型?

2.1 没有泛型的问题

假设我们需要打印不同类型的数据:

public void PrintInt(int value) { Console.WriteLine(value); } public void PrintString(string value) { Console.WriteLine(value); } public void PrintDouble(double value) { Console.WriteLine(value); }

可以发现:

代码逻辑完全一样。

区别只是:

int string double

类型不同。

如果项目中存在几十种类型:

代码维护成本会非常高。


三、使用泛型解决代码重复问题

我们可以改造成:

public void Print<T>(T value) { Console.WriteLine(value); }

调用:

Print<int>(100); Print<string>("Hello C#"); Print<double>(3.14);

输出:

100 Hello C# 3.14

一个方法解决所有类型。


四、泛型方法详解

4.1 泛型方法语法

访问修饰符 返回类型 方法名<T>(参数) { }

例如:

public void Show<T>(T value) { Console.WriteLine(value); }

其中:

部分含义
Show方法名称
T类型参数
value泛型参数

五、泛型类型自动推断

C# 编译器非常智能。

例如:

Show(100); Show("C#");

编译器自动推断:

第一次:

T = int

第二次:

T = string

所以通常开发中:

Show(100);

比:

Show<int>(100);

更加常见。


六、泛型类(Generic Class)

泛型不仅可以用于方法,也可以用于类。

普通类:

public class Student { public int Id { get; set; } }

只能保存 int。

如果需要 string:

需要重新创建一个类。


使用泛型类:

public class Student<T> { public T Id { get; set; } }

使用:

Student<int> student1 = new Student<int>(); student1.Id = 100; Student<string> student2 = new Student<string>(); student2.Id = "S001";

同一个类支持:

int string double DateTime

等各种类型。


七、C# 泛型集合(重点)

在实际开发中,泛型集合使用频率最高。

命名空间:

using System.Collections.Generic;

1. List<T> 动态数组

List<T> 是最常用集合。

示例:

List<string> names = new List<string>(); names.Add("张三"); names.Add("李四"); foreach(string name in names) { Console.WriteLine(name); }

输出:

张三 李四

2. Dictionary<TKey,TValue>

字典集合:

保存:

Key + Value

例如:

用户ID对应用户名:

Dictionary<int,string> users = new Dictionary<int,string>(); users.Add(1,"Tom"); users.Add(2,"Jack"); Console.WriteLine(users[1]);

输出:

Tom

3. Queue<T> 队列

特点:

先进先出(FIFO)

例如:

排队买票。

Queue<string> queue = new Queue<string>(); queue.Enqueue("用户A"); queue.Enqueue("用户B"); Console.WriteLine(queue.Dequeue());

输出:

用户A

4. Stack<T> 栈

特点:

先进后出(LIFO)

例如:

浏览器返回。

Stack<int> stack = new Stack<int>(); stack.Push(10); stack.Push(20); Console.WriteLine(stack.Pop());

输出:

20

八、泛型接口

接口也支持泛型。

例如:

public interface IRepository<T> { void Add(T entity); T Get(int id); }

实现:

public class UserRepository : IRepository<User> { public void Add(User user) { } public User Get(int id) { return new User(); } }

优势:

同一个接口支持:

User Order Product Customer

等实体。


九、泛型约束(高级重点)

有时候我们需要限制泛型类型。

例如:

只允许引用类型:

class Repository<T> where T : class { }

表示:

T必须是:

class类型

常见泛型约束

1. 引用类型约束

where T : class

2. 值类型约束

where T : struct

例如:

Repository<int>

3. 无参构造约束

where T : new()

要求:

public class User { public User() { } }

4. 父类约束

where T : Animal

表示:

T必须继承 Animal。


十、泛型和 Object 的区别

很多初学者会问:

为什么不用 object?

例如:

object value = 100;

这里发生:

装箱 Boxing

数据:

int ↓ object

取出:

int number = (int)value;

需要强制转换。


泛型:

List<int>

直接保存:

int

优势:

比较object泛型
类型安全
性能较低
需要转换需要不需要
代码复用一般优秀

十一、泛型实际开发应用

1. 数据仓储层

例如:

public class Repository<T> { public void Add(T entity) { Console.WriteLine("保存成功"); } }

使用:

Repository<User> userRepository = new Repository<User>(); Repository<Order> orderRepository = new Repository<Order>();

一套代码:

支持:

用户 订单 商品 日志

十二、C# 中常见泛型类型

.NET大量使用泛型:

类型用途
List<T>集合
Dictionary<TKey,TValue>键值数据
IEnumerable<T>数据遍历
Task<T>异步返回
Nullable<T>可空类型
Func<T>函数
Action<T>操作委托

十三、泛型面试常考问题

1. 什么是泛型?

答:

泛型是一种类型参数化技术,可以提高代码复用性和类型安全性。


2. 泛型相比 object 有什么优势?

答:

主要有:

  • 避免装箱拆箱
  • 类型安全
  • 性能更高
  • 减少代码重复

3. 泛型约束有什么作用?

答:

限制泛型类型必须满足一定条件,例如:

  • 必须是类
  • 必须继承某个类型
  • 必须具有无参构造函数

十四、总结

C# 泛型是现代 .NET 开发不可缺少的技术。

通过泛型,我们可以:

✅ 减少重复代码
✅ 提高代码复用能力
✅ 保证类型安全
✅ 提升程序性能
✅ 构建更加灵活的架构

http://www.jsqmd.com/news/1199850/

相关文章:

  • 拆解与洞察:从一枚18元的光电烟感报警器看国产消防电子的设计哲学
  • 网页字体优化:从格式选择到性能提升实战
  • Elsevier投稿追踪终极指南:告别焦虑,实时掌握审稿进度的完整教程
  • 2026苏州卫生间漏水维修怎么办?对比3家正规公司报价与施工方案(7月) - 防水企业百科
  • Python操作MySQL:从基础连接到CRUD实战
  • Windows文件扩展名安全与操作全解析
  • 如何免费在线查看SQLite数据库?这个浏览器工具让你3分钟上手
  • Windows系统光标自定义:从原理到实践的完整指南
  • 互联网大厂 Java 求职面试:从视频直播到微服务的挑战
  • Java集成友盟推送实战与优化指南
  • AI学习工具实战:xiaozhiAI应用与效率提升指南
  • 电商评论数据分析系统开发与情感分析实践
  • 三层交换机VLAN间通信与隔离:从基础互通到精细化ACL策略实战
  • 从零开始玩转业余无线电:新手快速上手指南
  • 音频发生器原理与硬件设计实战指南
  • Sopro TTS模型架构解析:轻量级设计背后的技术原理
  • VS Code本地接入DeepSeek V4 Pro替代Claude Code
  • 实测徐汇浦东长宁多家回收商!百达翡丽 Calatrava 裸表差价上千,哪家无盒证按实时行情估价 - 融媒生活
  • Linux系统运维实战:从环境搭建到性能调优
  • 数据库连接池配置陷阱与性能调优实战
  • 深入理解bpftrace与eBPF事件探测技术
  • Claude Code子代理机制:提升AI开发效率的并行处理方案
  • 终极Blender到虚幻引擎数据转换指南:免费Datasmith插件完整教程
  • Xen虚拟化架构详解:OpenEuler环境下的核心组件与工作原理
  • AI编程助手协作架构:多Agent分工提升开发效率
  • Python操作MySQL数据库实战指南
  • 2026南宁外墙渗水维修怎么处理?对比3家正规公司报价与施工方案(7月) - 防水企业百科
  • 最新AI量化工具推荐,先算清人工确认成本
  • FPGA图像处理核心:滑动窗口模块的通用化设计与资源优化策略
  • AI编程中的Skill与插件:本质区别与18个高效Skill解析