C# 泛型、文件、委托事件与多线程
C# 四大核心基础
一.1. 泛型(Generic)
核心作用:延迟类型指定、复用代码、避免装箱拆箱、类型安全
核心语法:<T> 占位符
分类
泛型方法
泛型类
泛型接口
泛型约束:基类约束、接口约束、值类型/引用类型约束、无参数构造函数约束
常用场景:通用工具类、集合封装、数据转换工具
2. 文件操作(File/Stream)
核心命名空间:System.IO
核心类
File:静态类,快速读写小文件
FileStream:文件流,大文件分段读写
StreamReader/StreamWriter:文本文件读写
Directory:文件夹创建、删除、遍历
常用操作:创建、删除、复制、移动、读取文本、写入文本、遍历文件
注意事项:文件释放、using释放流、路径大小写、权限问题
3. 委托与事件(Delegate/Event)
委托:方法的容器、方法指针、实现方法传参
自定义委托
内置委托:Func(有返回值)、Action(无返回值)、Predicate(返回bool)
多播委托:绑定多个方法,依次执行
事件:委托的安全封装、外部只能订阅/取消、不能直接赋值
核心作用:解耦、观察者模式、回调通知
场景:按钮点击、数据更新通知、异步回调
4. 多线程(Thread)
核心概念:进程、线程、主线程、子线程、并发、并行
常用实现方式
Thread:原生线程,自由度高
ThreadPool:线程池,复用线程
Task:推荐,轻量化、支持回调、取消
线程问题:线程安全、资源争抢、死锁
解决方案:lock锁、volatile、线程同步
适用场景:耗时操作(文件读写、网络请求、批量计算),避免UI卡顿
三、知识点通俗详解 + 极简实战代码
1. 泛型:一套代码,适配所有类型
1.1 什么是泛型?
大白话:泛型就是给类型“占坑”,定义代码时不指定具体数据类型,调用的时候再指定,实现代码复用,同时保证类型安全。
解决痛点:不用为int、string、自定义类分别写重复代码,避免频繁装箱拆箱,性能更高。
1.2 极简泛型案例
// 泛型方法:通用打印工具 public static void PrintInfo<T>(T info) { Console.WriteLine($"输出内容:{info},类型:{typeof(T)}"); } // 调用 PrintInfo(100); // 适配int PrintInfo("C#泛型"); // 适配string PrintInfo(3.14); // 适配double
1.3 核心总结
T 只是占位符,可换成任意字母(T、U、V)
泛型在编译时确定类型,类型安全,无装箱拆箱
配合约束可以限制T的类型范围,避免误用
2. 文件操作:本机文件读写万能工具
2.1 核心认知
C#所有文件操作都基于System.IO命名空间,日常开发90%的场景只需掌握:快速读写、流读写、文件夹操作。
小文件用File静态类,大文件用FileStream分段读写,避免内存溢出。
2.2 极简实战:文本文件读写
using System.IO; // 1. 写入文件(不存在则创建,存在则覆盖) File.WriteAllText("test.txt", "Hello C# 文件操作"); // 2. 读取文件 string content = File.ReadAllText("test.txt"); Console.WriteLine("文件内容:" + content); // 3. 追加内容 File.AppendAllText("test.txt", "\n追加的新内容");
2.3 关键注意点
所有流对象必须用using包裹,自动释放资源
相对路径默认在程序运行目录,绝对路径写完整地址
读写大文件禁止一次性读取,必须分段读取
3. 委托与事件:实现代码解耦和回调
3.1 通俗理解
委托:方法的“容器”,可以把方法当作参数传递
事件:委托的安全版封装,专门用来做通知、回调,禁止外部随意赋值覆盖
核心价值:解耦,发布者不需要知道订阅者是谁,触发事件即可通知所有订阅方法。
3.2 内置委托极简使用(不用自定义)
// Action:无返回值委托 Action sayHello = () => Console.WriteLine("Hello 委托"); sayHello(); // Func:有返回值委托 Func<int, int> add = a => a + 10; Console.WriteLine(add(5)); // 输出15
3.3 事件极简案例
// 定义事件 public event Action UpdateEvent; // 订阅事件 UpdateEvent += () => Console.WriteLine("数据更新了!"); // 触发事件 UpdateEvent?.Invoke();
4. 多线程:让程序同时干多件事
4.1 通俗理解
默认程序只有一条主线程,所有代码串行执行;多线程可以开启子线程,让耗时操作(读写文件、网络请求)后台执行,不阻塞主线程(常见:UI不卡顿)。
4.2 推荐用法:Task 多线程(最简)
using System.Threading.Tasks; Console.WriteLine("主线程开始"); // 开启子线程执行耗时任务 Task.Run(() => { for (int i = 0; i < 5; i++) { Console.WriteLine($"子线程执行:{i}"); Task.Delay(500).Wait(); } }); Console.WriteLine("主线程结束");
4.3 核心避坑点
多线程共享变量会出现资源争抢,必须加lock锁保证线程安全
避免频繁创建销毁线程,优先使用Task/线程池
子线程不能直接操作UI控件
四、四大知识点核心场景总结(面试/开发必记)
知识点 | 核心用途 | 高频场景 |
|---|---|---|
泛型 | 代码复用、类型安全 | 通用工具类、集合封装、DTO转换 |
文件操作 | 本地文件读写管理 | 日志记录、配置文件读写、批量文件处理 |
委托事件 | 解耦、回调通知 | 界面事件、数据监听、业务回调 |
多线程 | 异步并发、提升效率 | 耗时任务、批量处理、防止程序卡顿 |
五、结尾
以上四大知识点是C#从入门到进阶的必经之路,看似独立,实际项目中经常组合使用:比如多线程读写文件 + 泛型封装工具 + 事件通知读写结果,是非常经典的业务场景。