抽象类 多态一、语法糖Syntactic Sugar语法糖是指对语言功能没有实际影响但能方便程序员使用的语法。1.var—— 隐式类型推断编译时确定类型一旦推断不可更改。csharpvar age 30; // 编译器推断为 int var name 虹猫学园; // 编译器推断为 string2.dynamic—— 运行时类型推断运行时确定类型编译时不进行类型检查。csharpdynamic data 10; // 运行时为 int data 虹猫学园; // 运行时变为 string编译通过varvsdynamicvar性能更好、类型安全dynamic更灵活但存在运行时风险。3.const与readonly特点constreadonly初始化时机声明时声明时或构造函数中常量类型编译时常量运行时常量静态性默认静态需显式声明static引用类型仅限string和null可以是任何类型二、重写override与隐藏Hide重写条件函数成员、public/protected可见、签名一致。重写父类用virtual子类用override重新实现。csharpclass Vehicle { public virtual void Run() { ... } } class Car : Vehicle { public override void Run() { ... } }隐藏不用virtual/override子类会隐藏父类方法不常用。三、抽象类abstract抽象方法只有声明没有方法体必须在子类中重写。抽象类特点用abstract修饰不能被实例化。可以包含抽象方法和非抽象方法。子类必须重写所有抽象方法除非子类也是抽象类。可以有字段、属性、构造函数用于初始化成员。abstract不能与以下关键字共存private子类无法继承无法重写。static静态方法不能是抽象的。四、接口interface接口是功能的集合只声明不实现。定义格式csharppublic interface 接口名 { 抽象方法1; 抽象方法2; }接口特点方法默认是public abstract。不能包含字段、构造函数、静态成员。一个类可以实现多个接口。类与接口的关系类与类单继承类与接口多实现接口与接口多继承接口 vs 抽象类抽象类描述是什么如动物接口定义能做什么如飞行。五、多态Polymorphism1. 静态多态 —— 方法重载编译时决定调用哪个方法。2. 动态多态 —— 继承 重写形成条件①继承关系 ②方法重写 ③父类引用指向子类对象。csharpAnimal a new Dog(); // 父类引用指向子类对象 a.Eat(); // 运行时决定调用 Dog 的 Eat()3. 动态多态的成员访问规则成员类型编译期看运行期看成员变量父类父类成员方法父类子类动态绑定静态方法父类父类4. 引用类型转型向上转型隐式Animal a new Dog();向下转型显式Dog d (Dog)a;六、内部类定义在类内部的类适用于仅在该类中使用的辅助类。成员内部类创建方式Outer.Inner inner new Outer.Inner();泛型一、装箱与拆箱补充装箱值类型 → 引用类型object拆箱引用类型 → 值类型装箱拆箱会损耗性能泛型可以避免。二、为什么使用泛型避免为不同类型重复写相同逻辑。解决object方式的类型不安全与性能问题。三、泛型基础泛型是延迟声明定义时不指定类型调用时指定。可应用于方法、类、接口、委托。csharp// 泛型方法 public static void ShowT(T t) { ... } // 泛型类 public class GenericClassT { public T _T; } // 泛型接口 public interface IGenericInterfaceT { T GetT(T t); } // 泛型委托 public delegate void SayHiT(T t);四、泛型性能对比性能排序泛型方法 普通方法 object方法因为装箱拆箱。五、泛型约束where约束说明where T : structT 必须是值类型where T : classT 必须是引用类型where T : new()T 必须有无参公共构造函数where T : 基类名T 必须是指定基类或其派生类where T : 接口名T 必须实现指定接口⚠️new()约束必须放在最后。异常处理一、常见异常索引越界IndexOutOfRangeException空引用NullReferenceException除零异常DivideByZeroException二、异常体系结构textSystem.Exception ├── System.SystemException系统异常 │ ├── NullReferenceException │ ├── IndexOutOfRangeException │ └── DivideByZeroException └── System.ApplicationException自定义异常基类三、try-catch-finallycsharptry { // 可能出错的代码 } catch (DivideByZeroException ex) { // 处理特定异常 } catch (Exception ex) { // 处理其他所有异常 } finally { // 无论是否异常都执行释放资源 }四、throw与throw ex的区别写法说明throw;✅推荐保留原始异常堆栈throw ex;❌ 重置堆栈丢失原始异常源throw new Exception(msg, ex);包装异常保留内部异常五、自定义异常继承Exception或ApplicationException。提供三个构造函数无参、带消息、带消息内部异常。六、using语法糖using (资源对象) { ... }等价于try { ... } finally { 资源.Dispose(); }只能用于实现了IDisposable接口的对象如文件流、数据库连接。ArrayList 集合 队列 栈一、ArrayList非泛型集合本质是object数组容量自动扩充。缺点存储值类型需装箱读取需拆箱类型不安全。常用方法添加Add,Insert删除Remove,RemoveAt,RemoveRange,Clear查找Contains,IndexOf,LastIndexOf属性Count,Capacity二、Queue队列FIFO先进先出只能从队尾入队队头出队。核心方法Enqueue入队添加Dequeue出队移除并返回队头元素Peek查看队头元素不移除有泛型版本QueueT三、Stack栈LIFO后进先出只能从栈顶入栈和出栈。核心方法Push入栈添加Pop出栈移除并返回栈顶元素Peek查看栈顶元素不移除有泛型版本StackT字典 排序列表一、ListT泛型集合ArrayList的泛型版本类型安全无需装箱拆箱性能更好。csharpListStudent stus new ListStudent(); stus.Add(new Student { ID 1001, Name 貂蝉 });二、Hashtable哈希表键/值对集合键不能为null值可以为null。非泛型键和值都是object有装箱拆箱问题。常用方法Add,Remove,ContainsKey,ContainsValue三、DictionaryK, V泛型字典Hashtable的泛型版本类型安全性能更好。特点键唯一查找速度快接近 O(1)。常用属性和方法Count,Keys,ValuesAdd,ContainsKey,TryGetValue,Remove使用示例csharpDictionaryint, Student students new Dictionaryint, Student(); students.Add(stu1.ID, stu1); Student s students[1002]; // 通过键取值四、SortedList键/值对集合按键自动排序。可通过键或索引访问。五、集合嵌套csharpDictionarystring, Dictionaryint, Student school new Dictionary...(); // 学校 → 班级 → 学生 Console.WriteLine(school[net7][1002].Name);IO 流 文件操作一、Path类静态处理路径字符串GetFileName获取文件名GetExtension获取扩展名GetDirectoryName获取目录Combine拼接路径二、File类静态与FileInfo实例类特点File静态方法适合单次操作FileInfo实例方法适合多次操作同一文件File常用方法读写ReadAllText,WriteAllText,ReadAllLines,WriteAllLines操作Copy,Delete,Move,Exists三、Directory类静态与DirectoryInfo实例操作文件夹CreateDirectory,Delete,Move,Exists四、FileStream字节流读写任何类型的文件文本、图片、视频。csharpusing (FileStream fs new FileStream(path, FileMode.Open, FileAccess.Read)) { byte[] buffer new byte[1024 * 1024 * 5]; int r fs.Read(buffer, 0, buffer.Length); string s Encoding.UTF8.GetString(buffer, 0, r); }五、StreamReader/StreamWriter字符流专用于文本文件的读写。csharpusing (StreamReader sr new StreamReader(path)) { string line sr.ReadLine(); } using (StreamWriter sw new StreamWriter(path, true)) { // true 表示追加 sw.WriteLine(追加内容); }六、BufferedStream缓冲流包装其他流通过缓冲区提升读写性能。七、FileMode与FileAccessFileMode说明Create创建新文件存在则覆盖CreateNew创建新文件存在则报错Open打开现有文件OpenOrCreate存在则打开不存在则创建Append追加到文件末尾八、文件复制示例csharppublic static void CopyFile(string src, string dest) { using (FileStream fsRead new FileStream(src, FileMode.Open, FileAccess.Read)) using (FileStream fsWrite new FileStream(dest, FileMode.OpenOrCreate, FileAccess.Write)) { byte[] buffer new byte[1024 * 1024 * 5]; int r; while ((r fsRead.Read(buffer, 0, buffer.Length)) 0) { fsWrite.Write(buffer, 0, r); } } }九、CryptoStream加密流用于数据加密/解密可与FileStream配合使用。多线程 该文件与 Day13 同时提供内容相互补充。一、进程与线程进程工厂车间资源分配的基本单位。线程车间里的工人CPU 调度和执行的基本单位。二、Process类管理本地和远程进程。csharpProcess[] pros Process.GetProcesses(); // 获取所有进程 Process.Start(calc); // 打开计算器 pros[i].Kill(); // 终止进程三、Thread类命名空间System.Threading创建方式csharp// 无参 Thread t new Thread(Method); // 有参object 类型 Thread t new Thread(ParameterizedMethod); t.Start(obj);常用属性Name,IsAlive,IsBackground,Priority,ThreadState常用方法Start,Sleep,Join,Abort四、线程优先级枚举值Lowest,BelowNormal,Normal默认,AboveNormal,Highest高优先级线程获得更多 CPU 时间。五、线程同步 ——lock互斥锁确保同一时间只有一个线程访问共享资源。csharpprivate static object locker new object(); lock (locker) { // 临界区代码 }锁对象建议private static readonly object六、Mutex互斥锁可跨进程同步功能比lock强大。csharpMutex m new Mutex(true, MutexName, out bool createdNew); if (createdNew) { // 获得了互斥锁 } 本周学习总结本周学习内容覆盖了 C# 面向对象高级特性、数据集合、泛型、异常处理、文件 IO 和多线程编程。核心要点如下分类核心知识点面向对象抽象类、接口、多态虚方法/重写、类型转换语法增强var/dynamic、const/readonly、using语法糖集合ArrayList、ListT、Queue、Stack、Hashtable、DictionaryK,V、SortedList泛型泛型方法/类/接口/委托、泛型约束where异常try-catch-finally、throwvsthrow ex、自定义异常IO 与文件File/FileInfo、Directory/DirectoryInfo、FileStream、StreamReader/Writer多线程Process、Thread、线程优先级、lock和Mutex同步