在 C# 编程中,List
、Task
、Dictionary
和委托(Delegates)是常用的数据结构和功能特性,它们在处理集合、异步编程、键值对存储以及事件和回调实现中扮演着重要角色。
C# List
List<T>
是 C# 中的一个泛型集合,它实现了 IList<T>
接口,用于存储一个可增长和缩减的对象序列。List<T>
提供了添加、删除、查找和排序元素的方法。
-
创建 List:
List<int> numbers = new List<int>();
-
添加元素:
numbers.Add(1); // 添加单个元素 numbers.AddRange(new List<int> { 2, 3, 4 }); // 添加多个元素
-
访问元素:
int firstElement = numbers[0]; // 获取第一个元素
-
遍历 List:
foreach (int number in numbers) { Console.WriteLine(number); }
C# Task
Task
是 C# 中用于异步编程的一个核心组件,它表示一个异步操作的最终完成。Task
可以返回一个结果或者不返回任何结果(Task
类型),并且可以与其他 Task
对象组合和等待它们的完成。
-
创建 Task:
Task.Run(() => { // 异步执行的代码 });
-
等待 Task 完成:
await Task.Run(() => { // 异步执行的代码 });
-
组合 Task:
Task.WhenAll(tasks); // 等待多个 Task 完成
C# Dictionary
Dictionary<TKey, TValue>
是一个泛型集合,用于存储键值对。它实现了 IDictionary<TKey, TValue>
接口,提供了快速的查找、插入和删除操作。
-
创建 Dictionary:
Dictionary<string, int> ages = new Dictionary<string, int>();
-
添加元素:
ages.Add("Alice", 25); // 添加键值对
-
访问元素:
int age = ages["Alice"]; // 获取特定键的值
-
遍历 Dictionary:
foreach (KeyValuePair<string, int> pair in ages) { Console.WriteLine($"{pair.Key}: {pair.Value}"); }
C# 委托委托(Delegates
)
-
是 C# 中一种类型安全的函数指针,
-
它可以引用具有特定参数列表和返回类型的方法。
-
委托在实现回调、事件处理以及线程间的通信中非常有用。
-
- **定义委托:
-
public delegate void MyDelegate(string message);
-
创建委托实例:
-
MyDelegate del = new MyDelegate(ShowMessage);
-
调用委托:
-
del("Hello, World!"); // 调用委托,
输出消息
public event MyDelegate OnMessageReceived;
OnMessageReceived?.Invoke("New message"); // 触发事件
深入探讨 C# 中的 List
、Task
、Dictionary
和委托的高级用法和一些最佳实践。
高级用法和最佳实践 - List
-
使用 LINQ 查询 List: LINQ (Language Integrated Query) 提供了一种强大的查询机制,可以用来对
List
进行复杂的筛选、排序和转换操作。
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
-
异步操作 List: 当处理大量数据时,可以使用
async
和await
关键字结合Task
来异步执行操作,避免阻塞主线程。
await Task.Run(() => {
numbers.Sort();
});
高级用法和最佳实践 - Task
-
链式 Task 调用: 可以使用
ContinueWith
方法来创建任务的链式调用,实现复杂的异步工作流。
Task.Run(() => {
// 第一个任务
}).ContinueWith(prevTask => {
// 第二个任务,依赖于第一个任务的结果
});
-
取消任务: 通过
CancellationToken
可以取消正在执行的任务,避免资源浪费。
var cancellationTokenSource = new CancellationTokenSource();
Task.Run(() => {
while (!cancellationTokenSource.Token.IsCancellationRequested) {
// 执行长时间运行的任务
}
}, cancellationTokenSource.Token);
// 在需要时取消任务
cancellationTokenSource.Cancel();
高级用法和最佳实践 - Dictionary
-
使用计算属性: 当需要根据某些条件动态计算值时,可以使用计算属性。
ages["Alice"] = age => age + 1; // 假设 age 是一个外部变量
-
初始化 Dictionary: 可以使用对象初始化器来简化 Dictionary 的初始化过程。
Dictionary<string, int> ages = new Dictionary<string, int>
{
{"Alice", 25},
{"Bob", 30}
};
高级用法和最佳实践 - 委托
-
使用 lambda 表达式简化委托: lambda 表达式提供了一种简洁的方式来创建委托实例。
Action<string> printMessage = message => Console.WriteLine(message);
printMessage("Hello, World!");
-
多播委托: 多播委托允许将多个方法链接到同一个委托实例,当调用委托时,所有链接的方法都会被执行。
Action<string> multicastDelegate = message => Console.WriteLine(message);
multicastDelegate += (msg) => MessageBox.Show(msg);
multicastDelegate("Hello, World!"); // 会在控制台输出并显示消息框
-
使用委托实现事件: 委托在实现事件和回调机制时非常有用,可以轻松地管理和触发多个订阅者。
public delegate void DataReceivedEventHandler(object sender, string data);
public event DataReceivedEventHandler DataReceived;
protected virtual void OnDataReceived(string data)
{
DataReceived?.Invoke(this, data);
}
通过这些高级用法和最佳实践,你可以更有效地利用 C# 中的 List
、Task
、Dictionary
和委托,编写出更加高效、灵活和可维护的代码。这些特性是 C# 强大功能的一部分,能够帮助你解决复杂的编程问题。