本笔记系统整理了 C# 编程语言的基础语法、常用数据结构、算法基础以及面向对象核心机制。涵盖从程序基本结构、变量、运算符、函数到类与对象、继承、多态及高级字符串处理等核心内容。 本文档系统整理了 C# 进阶与核心知识点,涵盖面向对象设计原则、数据结构与泛型、委托与事件、多线程、反射与特性、进阶排序算法及特殊语法等内容。
CHAPTER 01
C# 基础语法与控制台交互
介绍 C# 程序的基本文件结构、输入输出方法、代码折叠规范以及各类基础转义字符的使用。
- 程序基础结构包含 using 命名空间、类和函数。
- WriteLine 与 Write 用于打印信息,ReadLine 与 ReadKey 用于接收控制台输入和按键检测。
- 使用 #region 和 #endregion 可以折叠代码以保持整洁。
- 转义字符包括常用的换行 \n、制表符 \t 以及通过 @ 取消转义。
CHAPTER 02
变量、常量与类型转换
讲解变量的本质、声明规范、常量特点以及不同数据类型之间的隐式与显式转换规则。
- float 类型声明时需加 F/f 后缀,decimal 需加 M/m 后缀。
- 变量名采用小驼峰命名法,方法名采用大驼峰命名法。
- 常量必须初始化且声明后不能修改。
- 类型转换分为隐式转换(小范围转大范围)和显式转换(括号强转、Parse 法和 Convert 法)。
CHAPTER 03
运算符与表达式
详细阐述算术运算符、条件运算符、逻辑运算符、位运算符以及三目运算符的应用规则与优先级。
- 算术运算符优先级:乘除取余 > 加减 > 赋值,括号可改变优先级。
- 逻辑与 (&&)、逻辑或 (||)、逻辑非 (!) 遵循短路求值规则。
- 位运算符包括按位与、或、异或、取反及左右移操作。
- 三目运算符的第一个条件表达式结果必须为 bool 类型。
CHAPTER 04
流程控制与异常捕获
总结条件分支语句、循环结构以及 try-catch 异常捕获机制,帮助编写健壮的代码逻辑。
- 异常捕获能有效避免代码报错导致程序直接卡死。
- switch 语句的 case 常量必须是写死的值,支持使用 break 贯穿。
- while 和 do...while 循环通过 break 和 continue 控制程序流。
- for 循环在处理确定范围的循环时比 while 更加方便。
CHAPTER 05
常见数据结构与排序算法
梳理枚举、一维与二维数组、结构体的使用方法,并深入剖析冒泡排序与选择排序的原理及优化。
- 枚举常用于表示状态类型,常与 switch 语句配合使用。
- 数组在使用前必须先初始化,一维和二维数组是常见的数据容器。
- 结构体是变量和函数的集合,属于值类型,声明时变量不能初始化。
- 冒泡排序通过两两比较相邻元素,并可通过标志位优化性能。
CHAPTER 06
面向对象 --- 封装与核心特性
全面解析面向对象编程中类与对象、成员变量、成员方法、属性、索引器及静态成员的核心概念。
- 类是对象的抽象,实例化一个类对象等同于声明一个变量。
- 成员属性通过 get 和 set 访问器保护字段,支持数据加密与解密。
- 静态成员(static)在程序启动时分配内存,生命周期直到程序结束。
- 拓展方法必须写在静态类中,且第一个参数必须用 this 修饰目标类型。
CHAPTER 07
面向对象 --- 继承与多态
探讨 C# 的单继承规则、里氏替换原则、万物之父 object、接口、抽象类以及多态的实现方式。
- C# 仅支持单继承,子类可以通过关键字继承父类并使用保护修饰符 protected。
- 里氏替换原则允许用父类容器装载子类对象,并可使用 is 和 as 进行类型判断与转换。
- 抽象类和抽象方法使用 abstract 关键字,继承者必须重写抽象方法。
- 接口定义行为规范,支持多实现,当出现同名方法时可通过显式实现接口解决。
CHAPTER 08
面向对象与设计原则
复习了抽象类与接口的区别及选择标准,并深入归纳了软件开发的七大设计原则。
- 抽象类表示对象的本质,接口表示行为的规范。
- 单一职责原则强调一个类只负责一项职责。
- 开闭原则要求对扩展开放,对修改关闭。
- 里氏替换原则保证基类可以被子类无缝替换。
- 依赖倒转原则提倡面向接口编程,依赖于抽象而不依赖于具体。
CHAPTER 09
数据结构与泛型
详细介绍了 C# 中的简单数据结构、泛型机制、泛型约束以及常用泛型集合的原理与使用。
- ArrayList 的本质是 object 类型的数组,存在装箱和拆箱开销。
- Stack 和 Queue 分别遵循先进后出和先进先出原则。
- 泛型是类型参数化的占位符,可以显著优化性能并避免装箱拆箱。
- 泛型约束包括值类型、引用类型以及无参公共构造函数约束等。
- Dictionary 基于键值对存储,通过键快速查找,查不到时会直接报错。
CHAPTER 10
委托、事件与 Lambda 表达式
讲解了委托的定义与多播用法、事件的封装机制,以及匿名函数与 Lambda 表达式的应用。
- 委托是将函数作为参数传递的引用类型,多播委托可以存储并依次执行多个函数。
- Action 和 Func 是系统内置的无返回值和有返回值的泛型委托。
- 事件本质上是对委托的封装,只能在类内部触发,保证了封装性。
- Lambda 表达式简化了匿名函数的书写,常用于集合排序和 LINQ 查询。
- 闭包现象中需注意临时变量的作用域变化问题。
CHAPTER 11
多线程与异步
介绍了进程、线程的概念,以及多线程编程中的线程同步与锁机制。
- 线程是进程中的实际运作单位,一个进程可以包含多个线程。
- 默认创建的是前台线程,主线程结束后前台线程仍会继续执行。
- 需将后台线程配合主程序关闭,以确保程序能正常退出。
- 多线程并发操作共享数据时容易产生冲突,需要使用加锁机制保证安全。
- 加锁虽然保证了线程安全,但会降低执行效率。
CHAPTER 12
反射与特性
探讨了程序集与元数据的概念,反射的动态类型操作,以及系统与自定义特性的应用。
- 反射允许在运行时获取程序集的元数据并动态实例化对象。
- Type 类是获取类型信息的核心,通过 GetMembers 可以获取所有公共成员。
- 特性本质是一个类,可为元数据添加额外的信息并在运行时读取。
- 常用系统特性包括过时特性 Obsolete 和条件编译特性 Conditional。
- Activator.CreateInstance 可以通过 Type 快速创建对象实例。
CHAPTER 13
特殊语法与高阶排序算法
梳理了 C# 的现代特殊语法(如可空类型、空合并操作符等)及五大经典进阶排序算法。
- 可空类型(?)允许值类型赋予 null 值,HasValue 用于判断是否有值。
- 空合并操作符(??)用于判断左侧是否为空,为空则返回右侧默认值。
- 插入排序通过构建有序序列,对于未排序数据在已排序序列中从后向前扫描进行插入。
- 归并排序采用分治法,将数组不断平分并合并有序子序列。
- 快速排序通过选择基准元素将数组分区实现高效排序。