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>`直接操作值类型。
- 减少了类型转换错误的风险。
总结[编辑 | 编辑源代码]
- 泛型类通过类型参数实现代码复用和类型安全。
- 支持约束以限制类型范围。
- 广泛用于集合、缓存等场景。
- 提供更好的性能和可读性。
通过泛型类,开发者可以编写更灵活、高效的代码,同时减少重复劳动。