跳到主要内容

C# 泛型类

介绍

在 C# 中,泛型类是一种允许你定义类时使用类型参数的机制。通过泛型类,你可以创建可以处理任何数据类型的类,而无需为每种数据类型编写单独的类。泛型类的主要优势在于代码的重用性和类型安全性。

泛型类最常见的例子是 List<T>,其中 T 是类型参数。你可以创建一个 List<int> 来存储整数,或者创建一个 List<string> 来存储字符串,而不需要为每种类型编写不同的列表类。

泛型类的基本语法

泛型类的定义与普通类类似,但在类名后面添加了类型参数。类型参数用尖括号 <> 括起来,通常用 T 表示(尽管你可以使用任何有效的标识符)。

csharp
public class MyGenericClass<T>
{
private T _value;

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

public T GetValue()
{
return _value;
}
}

在这个例子中,MyGenericClass<T> 是一个泛型类,T 是类型参数。你可以使用任何类型来实例化这个类。

使用泛型类

要使用泛型类,你需要在实例化时指定类型参数。例如:

csharp
var intGenericClass = new MyGenericClass<int>(42);
Console.WriteLine(intGenericClass.GetValue()); // 输出: 42

var stringGenericClass = new MyGenericClass<string>("Hello, Generics!");
Console.WriteLine(stringGenericClass.GetValue()); // 输出: Hello, Generics!

在这个例子中,我们分别创建了一个 MyGenericClass<int> 和一个 MyGenericClass<string> 的实例。intGenericClass 存储了一个整数,而 stringGenericClass 存储了一个字符串。

泛型类的约束

有时你可能希望限制泛型类可以使用的类型。C# 允许你通过类型约束来实现这一点。常见的约束包括:

  • where T : structT 必须是值类型。
  • where T : classT 必须是引用类型。
  • where T : new()T 必须有一个无参数的构造函数。
  • where T : <基类名>T 必须继承自指定的基类。
  • where T : <接口名>T 必须实现指定的接口。

例如,假设你希望 MyGenericClass<T> 只能处理实现了 IComparable 接口的类型:

csharp
public class MyGenericClass<T> where T : IComparable
{
private T _value;

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

public T GetValue()
{
return _value;
}
}

现在,如果你尝试使用一个没有实现 IComparable 接口的类型来实例化 MyGenericClass<T>,编译器会报错。

实际应用场景

泛型类在实际开发中有广泛的应用。以下是一些常见的场景:

  1. 集合类:如 List<T>Dictionary<TKey, TValue> 等,这些类可以存储任何类型的元素。
  2. 数据访问层:你可以创建一个泛型的 Repository<T> 类,用于处理不同类型的数据实体。
  3. 缓存:你可以创建一个泛型的 Cache<T> 类,用于缓存不同类型的数据。

例如,假设你正在开发一个简单的缓存系统:

csharp
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)
{
return _cache.ContainsKey(key) ? _cache[key] : default(T);
}
}

你可以使用这个 Cache<T> 类来缓存不同类型的数据:

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

var stringCache = new Cache<string>();
stringCache.Add("name", "Alice");
Console.WriteLine(stringCache.Get("name")); // 输出: Alice

总结

泛型类是 C# 中一个强大的特性,它允许你编写灵活且可重用的代码。通过使用泛型类,你可以避免为每种数据类型编写重复的代码,同时保持类型安全性。泛型类在集合、数据访问层、缓存等场景中有着广泛的应用。

提示

如果你对泛型类还不熟悉,建议从简单的例子开始,逐步尝试更复杂的应用场景。泛型类的概念在 C# 中非常重要,掌握它将大大提升你的编程能力。

附加资源与练习

  1. 练习:尝试创建一个泛型的 Stack<T> 类,实现 PushPop 方法。
  2. 阅读:查阅 Microsoft 官方文档 以了解更多关于泛型的详细信息。
  3. 挑战:创建一个泛型的 Queue<T> 类,并实现 EnqueueDequeue 方法。

通过不断练习和探索,你将能够更好地理解和应用 C# 中的泛型类。