泛型方法和泛型类可提升代码复用与类型安全,如定义PrintValue(T value)自动推断类型,Swap实现值交换,SimpleStack支持多类型栈操作,通过where约束限定类型条件,Pair类关联不同数据类型,避免装箱拆箱,增强性能。

泛型是 c# 中非常强大的特性,它允许我们编写可重用、类型安全的代码。通过使用泛型方法和泛型类,可以在不指定具体类型的情况下定义算法或数据结构,从而提高代码的灵活性和性能。本文将介绍如何在 C# 中使用泛型方法与泛型类,并提供实用示例。
泛型方法的使用
泛型方法是指在其定义中包含类型参数的方法。类型参数用尖括号 T 表示,运行时由实际传入的类型自动推断。
定义一个简单的泛型方法:
public Static void PrintValue
{
console.WriteLine($”Value: {value}, Type: {typeof(T)}”);
}
调用该方法时无需显式指定类型,编译器会根据传入参数自动推断:
PrintValue(100); // 输出: Value: 100, Type: System.Int32
PrintValue(“Hello”); // 输出: Value: Hello, Type: System.String
也可以手动指定类型:
PrintValue
泛型方法常用于工具类中,例如交换两个变量的值:
public static void Swap
{
T temp = a;
a = b;
b = temp;
}
调用方式:
int x = 10, y = 20;
Swap(ref x, ref y);
Console.WriteLine($”{x}, {y}”); // 输出: 20, 10
泛型类的定义与使用
泛型类允许类的操作针对多种类型保持一致。最常见的例子是集合类,如 List
自定义一个简单的泛型栈类:
public class SimpleStack
{
private List
public void Push(T item)
{
items.Add(item);
}
public T Pop()
{
if (items.count == 0)
throw new InvalidOperationException(“Stack is empty.”);
T item = items[items.Count – 1];
items.RemoveAt(items.Count – 1);
return item;
}
public int Count => items.Count;
}
使用这个泛型栈:
var stringStack = new SimpleStack
stringStack.Push(“First”);
stringStack.Push(“Second”);
Console.WriteLine(stringStack.Pop()); // 输出: Second
var intStack = new SimpleStack
intStack.Push(1);
intStack.Push(2);
Console.WriteLine(intStack.Pop()); // 输出: 2
泛型类的好处在于:一次定义,多类型复用,且避免了装箱拆箱带来的性能损耗。
约束泛型类型
有时我们需要对泛型参数做限制,比如要求它必须实现某个接口或具有无参构造函数。这时可以使用 泛型约束(where 关键字)。
常见约束包括:
- where T : class —— 必须是引用类型
- where T : Struct —— 必须是值类型
- where T : IComparable —— 必须实现指定接口
- where T : new() —— 必须有无参构造函数
- where T : MyBaseClass —— 必须继承自某个类
示例:只允许引用类型并具备无参构造函数:
public class ServiceFactory
{
public T CreateInstance()
{
return new T();
}
}
这样就能确保 new T() 是合法操作。
多个泛型参数的使用
泛型支持多个类型参数,适用于键值对、映射等场景。
例如定义一个简单的键值容器:
public class Pair
{
public TFirst First { get; set; }
public TSecond Second { get; set; }
public Pair(TFirst first, TSecond second)
{
First = first;
Second = second;
}
}
使用方式:
var pair = new Pair
Console.WriteLine($”{pair.First}: {pair.Second}”); // 输出: Age: 25
这种设计在需要关联不同类型数据时非常有用。
基本上就这些。掌握泛型方法和泛型类的使用,能让你写出更高效、更安全的 C# 代码。关键是理解类型参数的作用以及如何通过约束控制可用操作。实际开发中多结合集合、工厂模式、服务注册等场景练习,自然就能熟练运用。


