C# 知识点整理(泛型 / IO / 委托 / LINQ / 事件 / 多线程)
📅 2026/7/6 6:35:38
👁️ 阅读次数
📝 编程学习
一、泛型
- 核心作用参数化类型,一套代码适配多种类型;编译时类型校验,消除装箱拆箱,提升性能与复用性。
- 使用范围泛型类、泛型方法、泛型接口、泛型索引器,多泛型参数
<T,U>。 - 泛型约束 where(必记)
struct:只能值类型;class:只能引用类型new():类型必须有无参构造,多约束写在末尾- 父类 / 接口约束:T 必须继承指定类、实现接口
- 配套排序接口 IComparable<T>实现
CompareTo方法,返回负数 / 0 / 正数控制升、降序。 - 协变 out、逆变 inout 仅作返回值,in 仅作参数,解决泛型类型转换兼容。
二、文件与 IO 流(命名空间:using System.IO)
1. 文件 / 目录四大类
- 静态:
File、Directory,适合单次快速操作 - 实例:
FileInfo、DirectoryInfo,频繁读取文件属性优先使用 - 路径:绝对路径
D:\\xxx、相对路径;操作前判断Exists防报错
2. 基础文件操作
File:Create/Delete/Move/Copy/ReadAllText/WriteAllText; Directory:创建 / 删除 / 递归删除文件夹、遍历子文件。
3. 四大流
FileStream:字节流,通用读写图片、视频、所有文件,需手动转字节数组BufferedStream:缓冲流,大文件复制提速,减少磁盘 IOStreamReader/StreamWriter:文本专用,直接操作字符串,支持按行读写- 规范:所有流使用完必须
Close()释放资源,Flush强制写入缓存
4. 递归
递归遍历全部文件夹文件;递归实现斐波那契、累加求和。
三、委托、Lambda、LINQ
1. 自定义 delegate
方法容器,存储方法地址;多播委托+=绑定多个方法、-=移除。
2. 系统内置委托(无需手写 delegate)
Action:无返回值,支持 0~16 个参数Func:带返回值,最后一个泛型为返回类型
3. Lambda 表达式=>
简化匿名委托;单参数可省略括号,单行代码省略{}与 return。
4. 委托传参
将逻辑方法作为参数传入,实现代码解耦(集合过滤、删除核心原理)。
5. LINQ 链式(依托 Func)
常用:Where筛选、Distinct去重、OrderBy排序、ToList转回集合、ForEach遍历。
四、事件 event
- 本质:对委托封装,发布订阅模式,UI、通知场景专用。
- 委托 vs 事件: 外部只能
+=订阅、-=取消;仅定义类内部可触发,安全性更高。 - 标准写法
- 自定义委托绑定事件,
事件?.Invoke()空安全触发 - 系统标准
EventHandler(object sender, EventArgs e),无需自定义委托
- 自定义 add/remove 访问器,可拦截订阅操作。
- 规范:事件命名 OnXXX;多播仅保留最后一个方法返回值。
五、多线程 Thread(using System.Threading)
1. 基础概念
进程:独立程序内存容器;线程:进程内执行单元,并发抢占 CPU。
2. 线程基础操作
- 创建:构造传入方法 / Lambda;
Start()启动 Thread.Sleep(ms)线程休眠;Join()阻塞等待线程执行完毕IsBackground后台线程:前台线程全部结束,后台强制终止(启动前设置)- Priority:线程优先级,仅提高 CPU 获取概率,不保证顺序
3. 线程安全 lock
多线程操作共享数据会错乱;lock 互斥锁,同一时间仅一个线程执行临界代码;锁对象推荐私有 object,禁止值类型。
4. 补充拓展
ThreadPool线程池复用线程,减少创建销毁开销;Task 为.NET 现代多线程方案;嵌套锁易产生死锁。
六、注意点
- 文件操作判断路径存在,捕获 IO 异常;流必须关闭释放资源。
- 泛型约束多条件时
new()放最后。 - 委托、事件、LINQ 三者配合,是集合筛选、界面通知核心方案。
- 多线程共享数据必须加锁,区分前后线程避免程序提前退出。
编程学习
技术分享
实战经验