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

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.xdnf.cn/news/8987.html

相关文章:

  • python33天打卡
  • 电路图识图基础知识-绘制的规则(五)
  • js-day2
  • Pow(x,n) 快速幂
  • 软件测试过程中如何定位BUG
  • JESD204B 协议介绍
  • 当前上下文中不存在名称“X509CertificateLoader”,编译.NET 9依赖
  • Django orm详解--工作流程
  • ACM Latex模板:合并添加作者和单位
  • 李沐动手深度学习(pycharm中运行笔记)——10.多层感知机+从零实现+简介实现
  • 鸿蒙OSUniApp 实现动态的 tab 切换效果#三方框架 #Uniapp
  • 《软件工程》第 4 章 - 需求获取
  • XBench:重塑AI能力评估范式,红杉中国如何定义下一代智能体度量标准?
  • RAGFlow源码安装操作过程
  • Android studio进阶开发(六)--如何用真机通过okhttp连接服务器
  • idea中使用Maven创建项目
  • 深入研究Azure 容器网络接口 (CNI) overlay
  • 十四、【鸿蒙 NEXT】如何更改har包的版本号
  • 【React-rnd深度解析】- 01 看看核心逻辑
  • 汽车零部件行业PLM案例:得瑞客汽车(Dereik) 部署国产PLM
  • OpenHarmony平台驱动使用(三),DAC
  • pyqt中添加资源文件
  • STM32 RTC实时时钟\BKP备份寄存器\时间戳
  • 2025 年开源 LLM 发展趋势细致解读
  • Unity中partial的作用
  • MSSQL + SMB 捕获 NTLM 哈希和中继攻击
  • OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现
  • 康师傅的“价值战”答卷:一碗面的创新与担当
  • Trae中使用mcp连接MariaDB
  • 第五十二节:增强现实基础-简单 AR 应用实现