52、C# 泛型 (Generics)

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

基本概念

泛型类

csharp 复制代码
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");

泛型方法

csharp 复制代码
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");

泛型约束

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

csharp 复制代码
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 必须继承自特定基类

泛型接口和委托

泛型接口

csharp 复制代码
public interface IRepository<T>
{
    T GetById(int id);
    void Add(T entity);
}

public class SqlRepository<T> : IRepository<T>
{
    // 实现...
}

泛型委托

csharp 复制代码
public delegate T Processor<T>(T item);

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

泛型与性能

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

csharp 复制代码
// 非泛型版本(有装箱拆箱开销)
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):

csharp 复制代码
// 协变 - out 关键字
public interface IEnumerable<out T> : IEnumerable
{
    IEnumerator<T> GetEnumerator();
}

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

实际应用示例

csharp 复制代码
// 泛型缓存类
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# 中非常强大的特性,合理使用可以显著提高代码的质量和可维护性。

相关推荐
Yolo566Q43 分钟前
“R语言+遥感”的水环境综合评价方法实践技术应用
开发语言·r语言
文火冰糖的硅基工坊3 小时前
[激光原理与应用-317]:光学设计 - Solidworks - 草图
开发语言·python·信息可视化·系统架构
草莓熊Lotso3 小时前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day10
c语言·开发语言·经验分享·算法·强化
草明3 小时前
docker stats 增加一列容器名称的显示
java·开发语言·docker
He1955013 小时前
Go初级二
开发语言·后端·golang
格林威4 小时前
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型和EasyOCR实现汽车牌照动态检测和识别(C#代码,UI界面版)
人工智能·深度学习·数码相机·yolo·c#·汽车·视觉检测
Aczone284 小时前
Linux 软件编程(九)网络编程:IP、端口与 UDP 套接字
linux·网络·网络协议·tcp/ip·http·c#
yuyuyui4 小时前
Abp vNnext-事件总线使用实现及解析
.net·abp vnext
草莓熊Lotso4 小时前
【C++】--函数参数传递:传值与传引用的深度解析
c语言·开发语言·c++·其他·算法
Ice__Cai4 小时前
Flask 路由详解:构建灵活的 URL 映射系统
开发语言·python·flask