C# 知识点整理(泛型 / IO / 委托 / LINQ / 事件 / 多线程)

📅 2026/7/6 6:35:38 👁️ 阅读次数 📝 编程学习
C# 知识点整理(泛型 / IO / 委托 / LINQ / 事件 / 多线程)

一、泛型

  1. 核心作用参数化类型,一套代码适配多种类型;编译时类型校验,消除装箱拆箱,提升性能与复用性。
  2. 使用范围泛型类、泛型方法、泛型接口、泛型索引器,多泛型参数<T,U>
  3. 泛型约束 where(必记)
  • struct:只能值类型;class:只能引用类型
  • new():类型必须有无参构造,多约束写在末尾
  • 父类 / 接口约束:T 必须继承指定类、实现接口
  1. 配套排序接口 IComparable<T>实现CompareTo方法,返回负数 / 0 / 正数控制升、降序。
  2. 协变 out、逆变 inout 仅作返回值,in 仅作参数,解决泛型类型转换兼容。

二、文件与 IO 流(命名空间:using System.IO

1. 文件 / 目录四大类

  • 静态:FileDirectory,适合单次快速操作
  • 实例:FileInfoDirectoryInfo,频繁读取文件属性优先使用
  • 路径:绝对路径D:\\xxx、相对路径;操作前判断Exists防报错

2. 基础文件操作

File:Create/Delete/Move/Copy/ReadAllText/WriteAllText; Directory:创建 / 删除 / 递归删除文件夹、遍历子文件。

3. 四大流

  1. FileStream:字节流,通用读写图片、视频、所有文件,需手动转字节数组
  2. BufferedStream:缓冲流,大文件复制提速,减少磁盘 IO
  3. StreamReader/StreamWriter:文本专用,直接操作字符串,支持按行读写
  4. 规范:所有流使用完必须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

  1. 本质:对委托封装,发布订阅模式,UI、通知场景专用。
  2. 委托 vs 事件: 外部只能+=订阅、-=取消;仅定义类内部可触发,安全性更高。
  3. 标准写法
  • 自定义委托绑定事件,事件?.Invoke()空安全触发
  • 系统标准EventHandler(object sender, EventArgs e),无需自定义委托
  1. 自定义 add/remove 访问器,可拦截订阅操作。
  2. 规范:事件命名 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 现代多线程方案;嵌套锁易产生死锁。

六、注意点

  1. 文件操作判断路径存在,捕获 IO 异常;流必须关闭释放资源。
  2. 泛型约束多条件时new()放最后。
  3. 委托、事件、LINQ 三者配合,是集合筛选、界面通知核心方案。
  4. 多线程共享数据必须加锁,区分前后线程避免程序提前退出。