三、C#面向对象编程(泛型与集合类)

在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

通过使用并发集合类,你可以更安全地在多线程环境中操作集合数据,而无需担心同步和死锁问题。

相关推荐
hez20101 天前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉6 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫7 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫8 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6258 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902118 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠9 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫11 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech12 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf13 天前
C#摸鱼实录——IoC与DI案例详解
c#