在C#中,泛型和集合类是面向对象编程中非常重要的概念,它们提供了处理不同类型数据的灵活性和重用性。
泛型
泛型允许你定义类型参数化的类、接口或方法。这意味着你可以编写一个可以在多种类型上工作的组件,而不需要为每一种类型都编写新代码。泛型增加了代码的复用性,同时提供了类型安全。
下面是一个简单的泛型类的例子:
csharp
public class Box<T>
{
public T Item { get; set; }
}
在这个例子中,Box
是一个泛型类,它有一个类型参数 T
。你可以创建任何类型的 Box
,比如 Box<int>
、Box<string>
等。
集合类
C# 提供了一系列内置的泛型集合类,这些类在 System.Collections.Generic
命名空间下。最常用的集合类包括 List<T>
、Dictionary<TKey, TValue>
和 HashSet<T>
等。
List<T>
是一个有序集合,可以包含重复的元素。Dictionary<TKey, TValue>
是一个键值对集合,其中每一个键都是唯一的。HashSet<T>
是一个无序集合,不包含重复的元素。
下面是如何使用这些集合类的例子:
csharp
// 使用 List<T>
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
numbers.Add(6); // 添加元素
int firstNumber = numbers[0]; // 访问元素
// 使用 Dictionary<TKey, TValue>
Dictionary<string, int> ages = new Dictionary<string, int>();
ages["Alice"] = 30; // 添加键值对
ages["Bob"] = 25;
int aliceAge = ages["Alice"]; // 访问元素
// 使用 HashSet<T>
HashSet<string> uniqueNames = new HashSet<string>();
uniqueNames.Add("Alice"); // 添加元素
uniqueNames.Add("Bob");
bool isNamePresent = uniqueNames.Contains("Alice"); // 检查元素是否存在
这些集合类利用了泛型来提供类型安全,并且允许你在不同类型的元素上重用相同的集合逻辑。通过使用这些集合类,你可以更加容易地管理和操作数据,同时减少代码中的错误。
除了上述提到的泛型和集合类,C# 还提供了其他一些功能和概念,以支持面向对象编程中的泛型和集合处理。
泛型方法
除了泛型类,C# 还支持泛型方法。泛型方法允许你在不创建泛型类的情况下编写可以处理各种数据类型的代码。
csharp
public static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
默认值表达式
C# 7.0 引入了默认值表达式的概念,它允许你在泛型方法或委托中指定一个类型的默认值。这使得你可以在需要时提供一个默认的返回值或参数。
csharp
public static T GetOrDefault<T>(T value, [DefaultParameterValue(default(T))] T defaultValue)
{
return value ?? defaultValue;
}
集合的扩展方法
C# 提供了许多扩展方法,可以用来操作集合类。这些扩展方法在 System.Linq
命名空间下,允许你使用 LINQ (Language Integrated Query) 语法来查询、过滤和转换集合。
csharp
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0); // 使用 Where 方法筛选偶数
并发集合类(C# 5.0 及更高版本)
从 C# 5.0 开始,引入了并发集合类,这些类在 System.Collections.Concurrent
命名空间下。这些类设计用于多线程环境,提供线程安全的数据结构,例如 ConcurrentBag<T>
、ConcurrentQueue<T>
、ConcurrentDictionary<TKey, TValue>
等。
csharp
// 使用 ConcurrentDictionary<TKey, TValue>
ConcurrentDictionary<string, int> scores = new ConcurrentDictionary<string, int>();
scores.TryAdd("Alice", 100); // 添加键值对,如果键已存在则不添加并返回 false
bool isAdded = scores.TryAdd("Bob", 95); // 如果键已存在则不添加并返回 false,否则添加并返回 true
通过使用并发集合类,你可以更安全地在多线程环境中操作集合数据,而无需担心同步和死锁问题。