一、字典(Dictionary)
1.核心特性
键值对集合:
Dictionary<TKey, TValue>,键必须唯一,值可重复快速查找:基于哈希表实现,键的查找接近O(1)
非线程安全:多线程需使用
ConcurrentDictionary或手动同步
2.常用操作
// 创建与初始化 var dict = new Dictionary<string, int>(); var dict2 = new Dictionary<string, string>() { {"A", "Apple"} }; // 添加/更新 dict["key1"] = 10; // 直接赋值(新增或覆盖) dict.Add("key2", 20); // 仅新增,键存在则异常 // 访问 int value = dict["key1"]; // 键不存在抛异常 dict.TryGetValue("key1", out int val); // 安全访问 // 遍历 foreach(var kvp in dict) // KeyValuePair遍历 foreach(var key in dict.Keys) // 仅遍历键 // 删除 dict.Remove("key1"); // 返回是否成功 dict.Clear(); // 清空3.重要方法
ContainsKey():检查键是否存在(比TryGetValue略快)Keys/Values:获取键或值的集合自定义键类型需重写
GetHashCode()和Equals()
二、文件读取
1.System.IO常用类
| 类 | 用途 |
|---|---|
File | 静态方法,一次性操作小文件 |
FileStream | 低级字节流,大文件/二进制 |
StreamReader/Writer | 文本文件,按行/字符 |
BinaryReader/Writer | 二进制文件,特定数据类型 |
2.常见读取模式
// 1. 一次性读取(小文件) string text = File.ReadAllText("path.txt"); string[] lines = File.ReadAllLines("path.txt"); // 2. 流式读取(大文件/内存优化) using (var reader = new StreamReader("file.txt")) { string line; while ((line = reader.ReadLine()) != null) { // 逐行处理 } } // 3. 异步读取(推荐) string text = await File.ReadAllTextAsync("file.txt"); // 4. 二进制读取 using (var reader = new BinaryReader(File.OpenRead("data.bin"))) { int num = reader.ReadInt32(); double d = reader.ReadDouble(); }3.关键要点
始终使用
using语句确保资源释放路径处理:使用
Path.Combine()拼接路径异常处理:捕获
IOException、UnauthorizedAccessException等编码指定:
StreamReader默认UTF-8,中文需注意编码
三、委托(Delegate)
1.核心概念
类型安全的函数指针:定义方法签名,可绑定具体方法
多播委托:可关联多个方法(
+=/-=操作)基础类型:
Delegate→MulticastDelegate→ 自定义委托
2.委托演进
// 1. 传统委托(C# 1.0) delegate void MyDelegate(string msg); // 声明委托类型 MyDelegate del = new MyDelegate(MethodName); // 2. 泛型委托(C# 2.0+) Action<string> actionDel = MethodName; // 无返回值 Func<string, int> funcDel = MethodName; // 有返回值 Predicate<string> predDel = MethodName; // 返回bool // 3. 匿名方法与Lambda(C# 3.0+) Action<string> lambdaDel = (s) => Console.WriteLine(s); Func<int, int> square = x => x * x;3.事件模式
// 定义事件 public event EventHandler<MyEventArgs> MyEvent; // 触发事件 protected virtual void OnMyEvent(MyEventArgs e) { MyEvent?.Invoke(this, e); // 线程安全的调用 } // 订阅事件 obj.MyEvent += HandleEvent; obj.MyEvent -= HandleEvent;4.重点特性
协变/逆变(C# 4.0):
Func<out TResult>、Action<in T>闭包:Lambda可捕获外部变量(注意生命周期)
异步委托:
async与委托结合使用
四、综合应用示例
// 读取配置文件到字典 var config = new Dictionary<string, string>(); foreach (var line in File.ReadLines("config.txt")) { var parts = line.Split('='); if (parts.Length == 2) config[parts[0]] = parts[1]; } // 使用委托处理字典数据 Action<KeyValuePair<string, string>> printAction = kvp => Console.WriteLine($"{kvp.Key}: {kvp.Value}"); foreach (var item in config) printAction(item);五、最佳实践
字典:优先用
TryGetValue避免KeyNotFoundException文件:大文件用流式读取,始终用
using和异常处理委托:事件用
?.Invoke()空检查,Lambda避免过度捕获性能:字典预设容量,文件读取用异步,委托避免频繁分配
这些是C#开发中最常用且必须掌握的核心技术,熟练掌握后能解决大部分数据管理和事件驱动编程需求。