C# 泛型类
介绍
在 C# 中,泛型类是一种允许你定义类时使用类型参数的机制。通过泛型类,你可以创建可以处理任何数据类型的类,而无需为每种数据类型编写单独的类。泛型类的主要优势在于代码的重用性和类型安全性。
泛型类最常见的例子是 List<T>
,其中 T
是类型参数。你可以创建一个 List<int>
来存储整数,或者创建一个 List<string>
来存储字符串,而不需要为每种类型编写不同的列表类。
泛型类的基本语法
泛型类的定义与普通类类似,但在类名后面添加了类型参数。类型参数用尖括号 <>
括起来,通常用 T
表示(尽管你可以使用任何有效的标识符)。
public class MyGenericClass<T>
{
private T _value;
public MyGenericClass(T value)
{
_value = value;
}
public T GetValue()
{
return _value;
}
}
在这个例子中,MyGenericClass<T>
是一个泛型类,T
是类型参数。你可以使用任何类型来实例化这个类。
使用泛型类
要使用泛型类,你需要在实例化时指定类型参数。例如:
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 : struct
:T
必须是值类型。where T : class
:T
必须是引用类型。where T : new()
:T
必须有一个无参数的构造函数。where T : <基类名>
:T
必须继承自指定的基类。where T : <接口名>
:T
必须实现指定的接口。
例如,假设你希望 MyGenericClass<T>
只能处理实现了 IComparable
接口的类型:
public class MyGenericClass<T> where T : IComparable
{
private T _value;
public MyGenericClass(T value)
{
_value = value;
}
public T GetValue()
{
return _value;
}
}
现在,如果你尝试使用一个没有实现 IComparable
接口的类型来实例化 MyGenericClass<T>
,编译器会报错。
实际应用场景
泛型类在实际开发中有广泛的应用。以下是一些常见的场景:
- 集合类:如
List<T>
、Dictionary<TKey, TValue>
等,这些类可以存储任何类型的元素。 - 数据访问层:你可以创建一个泛型的
Repository<T>
类,用于处理不同类型的数据实体。 - 缓存:你可以创建一个泛型的
Cache<T>
类,用于缓存不同类型的数据。
例如,假设你正在开发一个简单的缓存系统:
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>
类来缓存不同类型的数据:
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# 中非常重要,掌握它将大大提升你的编程能力。
附加资源与练习
- 练习:尝试创建一个泛型的
Stack<T>
类,实现Push
和Pop
方法。 - 阅读:查阅 Microsoft 官方文档 以了解更多关于泛型的详细信息。
- 挑战:创建一个泛型的
Queue<T>
类,并实现Enqueue
和Dequeue
方法。
通过不断练习和探索,你将能够更好地理解和应用 C# 中的泛型类。