泛型 文件 委托

📅 2026/7/6 4:32:22
泛型 文件 委托
一、泛型一、泛型的定义概念泛型是一种编程范式在类、接口、方法、委托声明时引入类型参数 一套代码适配多种数据类型编译时替换为具体类型生成类型安全代码不用重复写多套逻辑。基础事例泛型类代码如下泛型方法的声明与调用二、泛型类型参数只是占位符不是真实类型实例化时必须传入具体类型三、泛型约束 where T : xxx用来限制类型参数 T 必须满足的条件where T : struct限制类型参数必须是值类型如 int、bool、DateTime 等确保实例存储在栈上避免空引用。where T : class限制类型参数必须是引用类型如 string、object、自定义类允许对实例进行空引用检查和赋值。where T : new()要求类型必须具有公共无参数构造函数使泛型代码能够直接创建T的实例new T()简化对象初始化。where T :限制类型必须是指定基类或其派生类。这允许泛型代码安全地访问基类中定义的方法、属性和受保护成员实现基于继承层次的通用逻辑。where T :限制类型必须实现指定的一个或多个接口。泛型代码可调用接口中定义的所有方法是实现“基于行为的泛型设计”的核心手段如确保类型支持比较或序列化。四、 泛型的四大核心优势1类型安全编译期校验类型杜绝运行时类型转换异常不会存错数据。2代码复用一套模板适配所有类型不用重复写IntStorage、StringStorage等重复类。3性能优化值类型存入泛型容器无装箱、拆箱操作相比ArrayList(object容器)大幅减少 GC 开销。旧方案ArrayListint 存进去装箱为 object取出拆箱损耗性能泛型List直接存储 int无转换。4可读性强类型参数直观表达代码通用设计阅读代码立刻知道该结构支持任意类型。五、协变与逆变out /in基础规则仅能用在泛型接口、泛型委托普通 class 泛型不支持 in/outout T 协变只向外返回 T只读输出允许子类型赋值给父类型变量in T 逆变只作为方法入参接收 T允许父类型赋值给子类型变量。**二、文件文件与目录操作完整知识点1.两大操作体系静态工具类File / Directory直接调用静态方法适合单次、简单文件操作用完自动释放资源无需实例化。File操作单个文件创建、移动、删除、读写、复制Directory操作文件夹 / 目录创建、遍历、删除子目录实例对象类FileInfo / DirectoryInfo需要new实例化适合对同一个文件 / 目录多次连续操作缓存文件信息性能更好可获取文件详细属性大小、创建时间、后缀等一、File 静态类 核心方法文件创建creat();代码如下文件移动Move();易错点1.第二个参数必须是文件完整路径不能仅传文件夹名2.目标文件夹不存在、文件被占用、路径错误会抛出IOException必须 try-catch 捕获文件删除 存在判断File.Exists(路径)返回 bool判断文件是否存在File.Delete 文件不存在不会抛异常但规范写法先判断。文件复制Copy(参数1源文件参数2目标路径true代表覆盖已有文件)文本一次性写入File.WriteAllText();// 一次性写入全部文本自动创建文件覆盖原有内容文本一次性读取 File.ReadAllText();字节读写二进制文件操作ReadAllBytes / WriteAllBytes 操作字节数组处理非文本文件图片、pdf、exe、doc 等二进制文件**UTF-8通用编码一个汉字占 3 字节(二)、FileInfo 文件信息实例类**针对同一个文件多次操作优先用 FileInfo缓存文件元数据获取文件详细属性**(三)、Directory / DirectoryInfo 目录文件夹操作创建文件夹Directory.CreateDirectory();获取当前目录文件夹GetFiles();获取当前目录下所有子文件夹GetDirectories();删除Delete()File和FileInfo的区别**三、流**1.所有流都继承抽象类 System.IO.Stream核心只有两个操作读Read、写Write。**2.分类两大体系字节流操作 byte所有文件通用、字符流操作 string仅文本 txt**字节流和字符流的区别字节流——FileStream / BufferedStream适用所有类型文件底层只操作 byte[] 字节数组数据单位1 字节 byte需要手动 Encoding 转字符串FileStream 文件字节流、BufferedStream 缓冲字节流2.字符流——StreamReader / StreamWriter适用仅限文本文件 txt专门处理中文、英文等字符数据单位字符 char不用手动转 byte 数组代表类StreamWriter 文本写入、StreamReader 文本读取****FileStream写入文本FileStream fis new FileStream(“demo.txt”,FileMode.OpenOrCreate);string s “HelloWorld”;byte[] bEncoding.UTF8.GetBytes(s); // 字符串转字节数组字节流必须手动转码fis.Write(b, 0, b.Length); // Write(字节数组,起始下标,写入长度)fis.Close(); // 关闭流释放资源1.filestream构造函数new FileStream(文件路径, FileMode 打开模式)FileMode.OpenOrCreate文件存在就打开不存在新建FileMode.Open文件必须存在否则报错FileMode.Create不存在新建存在直接清空覆盖2.字符串 与byte 转换字节流没有字符概念中文 / 英文必须用Encoding.UTF8互转byte[] bEncoding.UTF8.GetBytes(s);3.资源释放Close():手动关闭using():自动释放流BufferedStream 缓冲字节流作用给原始 FileStream 增加内存缓冲区减少磁盘 IO 次数大文件读写提速使用场景频繁小量读写文件时直接操作 FileStream 会频繁访问硬盘BufferedStream 先存在内存缓冲区攒够一批再写入磁盘StreamWriter 文本写入Flush ()字符流自带内存缓冲写入内容先存在内存不立刻进磁盘Flush 强制刷新到文件Close 关闭时会自动执行 FlushStreamReader 文本读取ReadLine()读取一行文本自动去掉换行符文件末尾返回 null循环终止条件ReadToEnd()一次性读取整个文本全部字符串适合小文件Read()读取单个字符返回 int-1 代表结束字节流和字符流选择1.图片 / 视频 / 压缩包 /exe → 必须 FileStream 字节流字符流会破坏二进制文件2.txt、md、csv 等纯文本 → 优先 StreamReader/StreamWriter 字符流代码简单自动处理中文编码换行MemoryStream 内存流数据读写在内存中不操作硬盘临时缓存字节NetworkStream 网络流**四、委托**一. 定义delegate 关键字声明委托本质方法的类型、方法的容器可以把方法当成变量传递、赋值、调用。特征只有签名返回值 参数列表没有方法体可以声明变量变量里存一个 / 多个方法调用委托变量 执行它内部绑定的所有方法。代码如下无参无返回委托delegate void Test();带一个int参数、返回bool的委托delegate bool Pre(T num);2. 委托赋值两种写法1.绑定已有命名方法 2.直接绑定匿名方法二、匿名方法在赋值委托时不用单独写一个命名方法直接写方法体。语法delegate(参数) { 代码 }三、Lambda 表达式参数部分单个参数可省略括号 u …0 个 / 多个参数必须加括号 ()、(x,y)方法体单行表达式可省略 {} 和 return多行代码块必须 {}有返回值要写 return四、三大系统内置泛型委托Action无返回值委托适用只执行逻辑不需要返回数据2.Func有返回值委托Predicate FuncT, bool专门用来判断筛选接收 T返回 bool等价于 FuncT,bool五、多播委托、- 绑定多个方法同一个委托变量可以挂载多个方法调用时按绑定顺序依次执行。绑定语法委托变量 方法 / Lambda移除委托变量 - 方法易错点易错题总结1。Lambda 单个参数可省括号无参 / 多参数必须括号2。多播有返回委托只保留最后一个返回值3.Predicate 等价 FuncT,bool仅语义区分4.委托是引用类型 会生成新委托实例不会修改原有委托变量。