C# 核心知识点总结:泛型、字典、异常、IO流、进程与线程
在C#开发中,泛型、字典、异常处理、IO流、进程和线程是日常开发高频使用、面试必考的核心基础知识点。这些知识点覆盖了数据存储、代码容错、文件操作、多任务处理四大核心场景。本文将系统梳理各知识点的核心原理、用法、优缺点及实战场景,搭配可运行代码示例,帮助大家彻底吃透基础,夯实C#开发功底。
一、C# 泛型(Generic)—— 类型复用的核心
1. 核心概念
泛型是C#提供的类型参数化技术,允许我们定义类、方法、接口时不指定具体数据类型,在调用时再传入实际类型。简单来说:泛型就是“模板”,一次定义,多种类型复用。
泛型的核心作用:解决值类型装箱拆箱损耗、避免重复代码、保证类型安全。
2. 核心优势
类型安全:编译时校验类型,杜绝类型转换异常
性能高效:无需装箱、拆箱操作,避免值类型性能损耗
代码复用:一套代码适配多种数据类型,无需重载多个方法
3. 常用泛型场景+代码示例
(1)泛型方法
适用于通用工具方法,适配任意数据类型
// 泛型方法:获取数组最大值,适配所有数值类型 public static T GetMax<T>(T[] arr) where T : IComparable<T> { T max = arr[0]; foreach (var item in arr) { if (item.CompareTo(max) > 0) max = item; } return max; } // 调用 int intMax = GetMax(new int[] { 1, 3, 5 }); double doubleMax = GetMax(new double[] { 1.2, 3.4, 2.1 });
(2)泛型约束
通过where限制泛型类型范围,避免非法类型传入,常用约束:值类型、引用类型、接口、无参数构造函数等。
(3)泛型集合
日常最常用的List<T>、Dictionary<TKey,TValue>均为泛型集合,替代非泛型的 ArrayList、Hashtable。
4. 总结
泛型是C#集合、框架通用方法的底层核心,只要是通用、多类型适配的场景,优先使用泛型,杜绝重复代码和装箱损耗。
二、Dictionary 字典——键值对高效存储容器
1. 核心概念
Dictionary<TKey, TValue>是C#专属的泛型键值对集合,基于哈希表实现,以「唯一键Key、对应值Value」的形式存储数据,是查询效率最高的集合之一。
2. 核心特性
Key 唯一且不可重复,Value 可重复、可空
增、删、查时间复杂度:O(1),效率远高于 List 遍历查询
无序存储(C#7.0+ 有序字典可使用 OrderedDictionary)
键值类型固定,类型安全,无装箱拆箱
3. 常用操作代码示例
// 1. 初始化字典 Dictionary<string, int> scoreDict = new Dictionary<string, int>() { { "张三", 95 }, { "李四", 88 } }; // 2. 添加元素(重复Key会报错) scoreDict.Add("王五", 92); // 3. 安全查询(避免Key不存在报错) if (scoreDict.TryGetValue("张三", out int score)) { Console.WriteLine($"张三的分数:{score}"); } // 4. 遍历字典 foreach (var item in scoreDict) { Console.WriteLine($"姓名:{item.Key},分数:{item.Value}"); } // 5. 删除元素 scoreDict.Remove("李四");
4. 适用场景与对比
适用场景:根据唯一标识快速查询数据、映射关系存储(ID-名称、账号-信息)、数据去重
对比List:List适合有序遍历、下标访问;Dictionary适合按键快速查询
三、C# 异常处理——程序容错的核心机制
1. 核心概念
异常是程序运行时出现的非预期错误(数组越界、空引用、文件不存在、格式错误等),C# 提供try-catch-finally-throw机制,用于捕获异常、处理错误、保证程序不崩溃。
2. 核心关键字
try:包裹可能出现异常的代码
catch:捕获指定类型异常,编写容错逻辑
finally:无论是否报错,都会执行(用于释放资源)
throw:主动抛出异常,向上层传递错误信息
3. 分层异常处理示例
try { // 可能报错的代码 string str = null; Console.WriteLine(str.Length); // 空引用异常 } catch (NullReferenceException ex) { // 精准捕获空引用异常 Console.WriteLine($"空引用错误:{ex.Message}"); } catch (Exception ex) { // 捕获所有未知异常(兜底) Console.WriteLine($"程序异常:{ex.Message}"); } finally { // 必执行:释放资源、关闭连接 Console.WriteLine("代码执行结束,释放资源"); }
4. 开发规范
禁止直接捕获所有异常(
catch(Exception))不做处理,避免隐藏BUG优先精准捕获具体异常,再用通用异常兜底
IO操作、网络请求、类型转换必须加异常处理
异常用于容错,不用于控制业务逻辑
四、C# IO流——文件与数据读写操作
1. 核心概念
IO(Input/Output,输入输出)流是C# 用于内存与外部设备(文件、网络、内存)数据传输的核心机制。流是数据传输的通道,所有文件读写、数据传输都基于流实现。
核心命名空间:System.IO
2. 流的分类
文件流 FileStream:底层字节流,读写所有类型文件(文本、图片、视频)
文本读写流 StreamReader/StreamWriter:专门读写文本文件,简化字符操作
内存流 MemoryStream:内存中读写数据,无需操作本地文件
3. 常用IO操作示例
(1)文本文件快速读写(推荐)
// 快速写入文本(覆盖原有内容) File.WriteAllText("test.txt", "Hello C# IO流"); // 快速读取文本 string content = File.ReadAllText("test.txt"); Console.WriteLine(content); // 追加内容 File.AppendAllText("test.txt", "\n追加的新内容");
(2)流式读写(大文件推荐,避免内存溢出)
// 写入大文件 using (StreamWriter sw = new StreamWriter("bigFile.txt")) { sw.WriteLine("第一行数据"); sw.WriteLine("第二行数据"); } // 读取大文件 using (StreamReader sr = new StreamReader("bigFile.txt")) { string line; // 逐行读取,节省内存 while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } }
4. 核心注意事项
所有流对象必须释放资源,优先使用
using语句(自动释放)小文件使用 File 静态方法,大文件使用流式读写
IO操作必须嵌套 try-catch,处理文件不存在、权限不足等异常
五、进程与线程——C# 多任务核心
1. 核心概念与区别
(1)进程(Process)
进程是操作系统资源分配的最小单位,是独立运行的程序实例(如浏览器、VS、QQ)。每个进程独占独立内存空间,进程之间相互隔离、互不干扰。
(2)线程(Thread)
线程是CPU调度执行的最小单位,是进程内的执行单元。一个进程至少包含一个主线程,多个线程共享进程内存资源。
2. 进程与线程核心区别
对比维度 | 进程 | 线程 |
|---|---|---|
资源占用 | 占用内存、CPU资源高,开销大 | 轻量级,开销极小 |
内存隔离 | 进程间内存完全隔离 | 同进程线程共享内存 |
通信难度 | 跨进程通信复杂 | 线程间通信简单 |
崩溃影响 | 单个进程崩溃不影响其他进程 | 一个线程崩溃,整个进程崩溃 |
3. C# 线程基础用法
// 1. 创建子线程 Thread thread = new Thread(() => { Console.WriteLine("子线程执行任务"); Thread.Sleep(1000); // 线程休眠1秒 }); // 2. 启动线程 thread.Start(); // 3. 等待线程执行完毕 thread.Join(); Console.WriteLine("子线程执行完成,主线程结束");
4. 进阶补充(开发常用)
主线程:程序启动默认的唯一线程,负责页面渲染、主逻辑执行
线程阻塞:Sleep、Join 会阻塞当前线程,避免频繁阻塞主线程(防止程序卡顿)
后续迭代:实际开发中极少直接用 Thread,优先使用 Task、ThreadPool、异步 async/await(更高效、易管理)
六、知识点整体总结
本文梳理的六大C#核心知识点,构成了C#基础开发的基石,各知识点各司其职、相互配合:
泛型:解决代码复用和类型安全问题,是所有泛型集合的基础;
Dictionary字典:高效键值对存储,适配高频查询、映射数据场景;
异常处理:保障程序稳定性,是所有IO、网络、复杂逻辑的必备容错机制;
IO流:实现本地文件、内存数据的读写交互,是数据持久化的核心;
进程线程:实现多任务并发执行,解决程序卡顿、高效执行