1. 程序结构与编译机制
- 基本构成:C# 程序由命名空间、类、方法、属性和语句块等组成。
- 程序集 (Assembly) :
.cs源文件通过编译器编译成程序集(.exe或.dll)。它是 .NET 的打包和部署单元。 - 入口点 :应用程序必须包含一个
Main方法或使用 顶级语句 作为执行入口。 - dotnet 工具:用于管理、构建和运行 .NET 源代码的命令行工具。
2. 语法规范
- 标识符:区分大小写。通常局部变量小写开头,方法和类大写开头。
- 关键字 :大部分为保留字。若要使用关键字做标识符,需加
@前缀。 - 注释 :支持单行 (
//)、多行 (/*...*/) 和 XML 文档注释 (///)。
3. 类型系统
值类型 (Value Types)
- 包含 :内置数值类型、
bool、char、struct、enum。 - 特点 :直接存储数据值,赋值时会进行实例复制。
引用类型 (Reference Types)
- 包含 :
class、string、数组、委托、接口。 - 特点 :包含对象引用和对象本身,赋值时仅复制引用。
- 存储 :对象分配在堆 (Heap) 上,引用通常在栈 (Stack) 上。
类型转换
- 隐式转换 :编译器确保转换安全且无信息丢失(如
int转long)。 - 显式转换:可能导致信息丢失或失败,需使用强制转换符。
4. 数值与布尔类型
- 整数 :包含有符号 (
int,long等) 和无符号 (uint,ulong等) 类型。C# 9 引入了原生大小的nint和nuint。 - 实数 :
float、double(用于科学计算,有舍入误差)和decimal(高精度,用于金融)。 - 溢出检查 :默认不检查(周而复始),可用
checked运算符显式开启溢出检查。 - 布尔类型 :
bool(true/false),不可与数值类型直接转换。
5. 字符串与字符
- char:表示 16 位 Unicode 字符。
- string :不可变的字符序列,虽然是引用类型,但其相等运算遵循值语义。
- 特性:
- 原意字面量 :
@""不处理转义字符。 - 字符串插值 :
$""允许在大括号中嵌入表达式。
6. 数组
-
特性:元素存储在连续内存中,索引从 0 开始。
-
索引与范围 (C# 8):
-
^n:从末尾计算索引。 -
..:切片操作(如1..3)。 -
多维数组 :分为矩形数组 (
int[,]) 和锯齿数组 (数组的数组int[][])。
7. 变量与参数传递
- 栈与堆:栈负责局部变量和参数(生命周期随函数);堆负责对象实例(由垃圾回收器管理)。
- 参数传递修饰符:
ref:按引用传递,传入前需初始化。out:按引用传递,用于多返回值,传入前不要求初始化,但方法内必须赋值。in(C# 7):按引用传递,但方法内不可修改(只读)。params:允许方法接收可变数量的参数。
8. 运算符与 Null 处理
-
Null 运算符:
-
??(合并):左侧为 null 则返回右侧值。 -
??=(赋值):左侧为 null 则将右侧值赋给它。 -
?.(条件访问):左侧为 null 则直接返回 null,不抛异常。 -
优先级 :赋值、Null 合并、条件运算符是右结合的。
9. 控制流语句
-
选择语句 :
if-else、switch。 -
switch 增强 :支持按类型 switch、模式匹配及 switch 表达式。
-
循环语句 :
while、do-while、for、foreach(用于遍历集合)。 -
跳转语句 :
break、continue、goto、return、throw。
10. 命名空间 (Namespace)
- 作用:组织类型,避免命名冲突。
- using 指令 :导入命名空间或静态成员 (
using static)。 - C# 10 新特性:
- 文件范围命名空间 :
namespace MyNamespace;减少嵌套。 - 全局 using :
global using在整个项目中生效。