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

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

相关推荐
树叶@12 分钟前
Python数据分析7
开发语言·python
wydaicls15 分钟前
十一.C++ 类 -- 面向对象思想
开发语言·c++
Biomamba生信基地1 小时前
R语言基础| 下载、安装
开发语言·r语言·生信·医药
姜君竹1 小时前
QT的工程文件.pro文件
开发语言·c++·qt·系统架构
奇树谦1 小时前
使用VTK还是OpenGL集成到qt程序里哪个好?
开发语言·qt
VBA63371 小时前
VBA之Word应用第三章第十节:文档Document对象的方法(三)
开发语言
老胖闲聊1 小时前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
码界奇点2 小时前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
贩卖纯净水.2 小时前
浏览器兼容-polyfill-本地服务-优化
开发语言·前端·javascript
k要开心2 小时前
C++概念以及基础框架语法
开发语言·c++