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

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

相关推荐
阿里嘎多学长13 分钟前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
weixin_307779132 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
2601_966949652 小时前
为什么量化回测中 for 循环比 DataFrame 慢三个数量级?从向量化原理讲起
开发语言·python·pandas·股票数据·quantdash
边境悍匪4 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
我的xiaodoujiao4 小时前
Django 基础知识详细图文教程 9-Django 模板引擎 2
开发语言·数据库·后端·django
菜鸟~noob2334 小时前
【太空电子战】从CCS到Meadowlands:反通信系统的二十年演进史【含matlab代码】
开发语言·matlab
2501_930707784 小时前
使用C#代码使用条件格式为 Excel 隔行设置颜色
c#·excel
quantdash_cc5 小时前
量化策略为什么需要实时行情数据?从信号产生到交易决策的时间差说起
开发语言·python·数据分析·量化交易·股票数据·quantdash
逆向编程6 小时前
QGIS地图投影(CRS坐标参照系)设置
开发语言
free-elcmacom6 小时前
发际线警告!手撕《C陷阱与缺陷》终极 BOSS:signal 函数与 typedef 魔法
c语言·开发语言·visual studio code·visual studio