跳转到内容

C Sharp 泛型类

来自代码酷

C#泛型类是C#语言中一种强大的特性,允许开发者创建可重用的、类型安全的类,而无需在编译时指定具体的数据类型。泛型类通过类型参数(Type Parameters)实现,使得代码更加灵活且减少重复。

介绍[编辑 | 编辑源代码]

泛型类的主要目的是提供**类型安全性**和**代码复用性**。通过泛型,可以避免装箱(Boxing)和拆箱(Unboxing)操作,提高性能。例如,`List<T>`是.NET中最常见的泛型类之一,其中`T`是类型参数,可以是任何数据类型(如`int`、`string`或自定义类)。

泛型类适用于以下场景:

  • 需要操作多种数据类型,但逻辑相同(如集合类)。
  • 避免强制类型转换,减少运行时错误。
  • 提高代码的可读性和维护性。

语法[编辑 | 编辑源代码]

泛型类使用尖括号`<>`定义类型参数,语法如下:

  
public class GenericClass<T>  
{  
    private T _value;  

    public GenericClass(T value)  
    {  
        _value = value;  
    }  

    public T GetValue()  
    {  
        return _value;  
    }  
}
  • `T`是类型参数,在实例化时替换为具体类型(如`int`或`string`)。
  • 泛型类可以有多个类型参数,如`GenericClass<TKey, TValue>`。

示例:基本用法[编辑 | 编辑源代码]

  
// 实例化泛型类  
var intContainer = new GenericClass<int>(42);  
var stringContainer = new GenericClass<string>("Hello");  

Console.WriteLine(intContainer.GetValue());  // 输出: 42  
Console.WriteLine(stringContainer.GetValue()); // 输出: Hello

类型约束[编辑 | 编辑源代码]

通过约束(Constraints)可以限制类型参数的范围,确保安全性。常用约束包括:

  • `where T : struct`:`T`必须是值类型。
  • `where T : class`:`T`必须是引用类型。
  • `where T : new()`:`T`必须有无参构造函数。
  • `where T : BaseClass`:`T`必须继承自`BaseClass`。

示例:带约束的泛型类[编辑 | 编辑源代码]

  
public class Calculator<T> where T : IComparable  
{  
    public T Max(T a, T b)  
    {  
        return a.CompareTo(b) > 0 ? a : b;  
    }  
}  

// 使用  
var calculator = new Calculator<int>();  
Console.WriteLine(calculator.Max(10, 20)); // 输出: 20

实际应用案例[编辑 | 编辑源代码]

案例1:泛型集合[编辑 | 编辑源代码]

.NET的`List<T>`是泛型类的典型应用,避免了非泛型集合(如`ArrayList`)的装箱问题:

  
List<int> numbers = new List<int> { 1, 2, 3 };  
List<string> names = new List<string> { "Alice", "Bob" };

案例2:泛型缓存[编辑 | 编辑源代码]

创建一个缓存类,存储任意类型的数据:

  
public class Cache<T>  
{  
    private Dictionary<string, T> _cache = new Dictionary<string, T>();  

    public void Add(string key, T value) => _cache[key] = value;  
    public T Get(string key) => _cache[key];  
}  

// 使用  
var intCache = new Cache<int>();  
intCache.Add("age", 25);  
Console.WriteLine(intCache.Get("age")); // 输出: 25

泛型类与继承[编辑 | 编辑源代码]

泛型类可以继承自非泛型类或泛型类:

  
public class BaseClass { }  
public class DerivedGenericClass<T> : BaseClass { }  

// 或继承自泛型基类  
public class BaseGenericClass<T> { }  
public class DerivedClass<T> : BaseGenericClass<T> { }

性能优势[编辑 | 编辑源代码]

泛型类在编译时生成特定类型的代码,避免了运行时类型检查的开销。例如:

  • 非泛型`ArrayList`需要装箱`int`为`object`,而`List<int>`直接操作值类型。
  • 减少了类型转换错误的风险。

总结[编辑 | 编辑源代码]

  • 泛型类通过类型参数实现代码复用和类型安全。
  • 支持约束以限制类型范围。
  • 广泛用于集合、缓存等场景。
  • 提供更好的性能和可读性。

classDiagram class GenericClass<T> { -T _value +GenericClass(T value) +T GetValue() } GenericClass <|-- Cache : 继承

通过泛型类,开发者可以编写更灵活、高效的代码,同时减少重复劳动。