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

52、C# 泛型 (Generics)

泛型是 C# 2.0 引入的一项强大功能,它允许你编写可以处理多种数据类型的代码,而无需为每种类型重复编写相同的逻辑。泛型提高了代码的重用性、类型安全性和性能。

基本概念

泛型类

public class GenericClass<T>
{private T _value;public GenericClass(T value){_value = value;}public T GetValue(){return _value;}
}// 使用示例
var intClass = new GenericClass<int>(42);
var stringClass = new GenericClass<string>("Hello");

泛型方法

public class Utility
{public static T Max<T>(T a, T b) where T : IComparable<T>{return a.CompareTo(b) > 0 ? a : b;}
}// 使用示例
int maxInt = Utility.Max(10, 20);
string maxString = Utility.Max("apple", "orange");

泛型约束

泛型约束用于限制类型参数可以使用的类型:

public class ConstrainedClass<T> where T : class, new()
{// T 必须是引用类型且有无参构造函数
}

常见的约束类型:

  • where T : class - T 必须是引用类型
  • where T : struct - T 必须是值类型
  • where T : new() - T 必须有无参构造函数
  • where T : IComparable - T 必须实现特定接口
  • where T : BaseClass - T 必须继承自特定基类

泛型接口和委托

泛型接口

public interface IRepository<T>
{T GetById(int id);void Add(T entity);
}public class SqlRepository<T> : IRepository<T>
{// 实现...
}

泛型委托

public delegate T Processor<T>(T item);// 使用示例
Processor<int> square = x => x * x;
int result = square(5); // 25

泛型与性能

泛型提供了类型安全性,同时避免了装箱和拆箱操作,提高了性能:

// 非泛型版本(有装箱拆箱开销)
ArrayList list = new ArrayList();
list.Add(42); // 装箱
int value = (int)list[0]; // 拆箱// 泛型版本(无装箱拆箱)
List<int> genericList = new List<int>();
genericList.Add(42); // 无装箱
int genericValue = genericList[0]; // 无拆箱

协变和逆变

C# 4.0 引入了协变(covariance)和逆变(contravariance):

// 协变 - out 关键字
public interface IEnumerable<out T> : IEnumerable
{IEnumerator<T> GetEnumerator();
}// 逆变 - in 关键字
public interface IComparer<in T>
{int Compare(T x, T y);
}

实际应用示例

// 泛型缓存类
public class Cache<TKey, TValue>
{private readonly Dictionary<TKey, TValue> _cache = new Dictionary<TKey, TValue>();public void Add(TKey key, TValue value){_cache[key] = value;}public bool TryGet(TKey key, out TValue value){return _cache.TryGetValue(key, out value);}
}// 使用示例
var userCache = new Cache<int, string>();
userCache.Add(1, "Alice");
userCache.Add(2, "Bob");

泛型是 C# 中非常强大的特性,合理使用可以显著提高代码的质量和可维护性。
在这里插入图片描述

http://www.lryc.cn/news/2392493.html

相关文章:

  • 理解 Vue 2 的响应式原理:数据劫持与依赖收集的背后
  • 深入理解 Pinia:Vue 状态管理的革新与实践
  • Dubbo高频面试题
  • Allegro X PCB设计小诀窍--05.如何在Allegro X中实现隐藏电源飞线效果
  • 一篇文章教会你ESP8266串口WIFI无线模块实现物联网无线收发,附STM32代码示例
  • 算法-基础算法
  • 特种设备作业人员-G3锅炉水处理如何备考学习?
  • Reactor模式详解:高并发场景下的事件驱动架构
  • UniApp 生产批次管理模块技术文档
  • 项目日记 -Qt音乐播放器 -设置任务栏图标与托盘图标
  • 国产 BIM 软件万翼斗拱的技术突破与现实差距 —— 在创新与迭代中寻找破局之路
  • 记录算法笔记(2025.5.29)最小栈
  • Android SurfaceFlinger核心工作机制
  • Golang|etcd服务注册与发现 策略模式
  • 深度解析UniApp盲盒系统开发:从源码架构到多端部署全流程
  • STM32的OLED显示程序亲测可用:适用于多种场景的稳定显示解决方案
  • 【AI News | 20250529】每日AI进展
  • Day12 - 计算机网络 - HTTP
  • Linux驱动学习笔记(十)
  • 如何优化Elasticsearch的搜索性能?
  • TI dsp FSI (快速串行接口)
  • 责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)
  • nlp中的频率就是权重吗
  • 融智学“新五常”框架:五维方式的重构与协同
  • wechat-003-学习笔记
  • 【大模型微调】魔搭社区GPU进行LLaMA-Factory微调大模型自我认知
  • 基于MATLAB编程针对NCV检测数据去漂移任务的完整解决方案
  • 【数据结构】哈希表的实现
  • 永磁同步电机控制算法--基于电磁转矩反馈补偿的新型IP调节器
  • RabbitMQ 应用 - SpringBoot