三、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

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

相关推荐
不会C语言的男孩33 分钟前
C++ Primer 第3章:字符串、向量和数组
开发语言·c++
兰令水35 分钟前
leecodecode【反前后指针】【2026.5.31打卡-java版本】
java·开发语言
Dovis(誓平步青云)1 小时前
《QT学习第四篇:常见事件与UDP、TCP、文件系统、(锁、信号量、条件变量》
c语言·开发语言·汇编·qt
isyangli_blog10 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb20081110 小时前
FastAPI APIRouter
开发语言·python
Benszen10 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆10 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木10 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充11 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~11 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言