C#基础语法
## 一、基本数据类型
1. **值类型**
* **整数类型** :包括 `byte`、`short`、`int`、`long`
* **浮点数类型** :`float`(单精度,约 7 位有效数字)和 `double`(双精度,约 15 - 16 位有效数字)。表示小数时默认为 `double` 类型,若要指定为 `float`,需在数值后加 `f` 或 `F`。
* **字符类型** :`char`,用于表示单个 Unicode 字符,用单引号括起来。例如:`char c = 'A';`
* **布尔类型** :`bool`,只有两个值 `true` 和 `false`。
2. **引用类型**
* **字符串** :`string`,表示字符序列,用双引号括起来。字符串具有不可变性,即一旦创建,其内容不能改变。
* **数组** :用于存储多个相同类型的数据。例如:`int[] numbers = new int[5];` 表示创建一个长度为 5 的整型数组。
* **类** :用于定义对象的蓝图,通过 `new` 关键字创建对象实例。
## 二、变量与常量
1. **变量声明与初始化**
* 显式类型声明:`类型 变量名 = 初始值;` 例如:`int x = 10;`
* 隐式类型声明(`var`):`var 变量名 = 初始值;` 编译器会根据初始值推断变量类型。但 `var` 不能用于返回值类型不明确的表达式,如 `var result = new object();` 会导致错误。
* 多变量声明:`类型 变量 1, 变量 2, ..., 变量 n;` 例如:`int a, b, c;`
2. **常量**
* 使用 `const` 关键字声明常量,必须在声明时初始化,且其值不能改变。例如:`const double PI = 3.14159;`
## 三、运算符与表达式
1. **算术运算符** :`+`、`-`、`*`、`/`、`%`(取模)。
2. **关系运算符** :`==`(等于)、`!=`(不等于)、`>`(大于)、`<`(小于)、`>=`(大于等于)、`<=`(小于等于)。关系运算结果为布尔值。
3. **逻辑运算符**
* `&&`(逻辑与):只有两个操作数都为 `true` 时结果才为 `true`。
* `||`(逻辑或):只要有一个操作数为 `true` 结果就为 `true`。
* `!`(逻辑非):对布尔值取反。
## 四、流程控制
1. **条件语句**
* `if` 语句:`if (条件) { 语句块 }`,当条件为 `true` 时执行语句块。
* `if-else` 语句:`if (条件) { 语句块 1 } else { 语句块 2 }`,条件为 `true` 执行语句块 1,否则执行语句块 2。
* `switch` 语句:用于多分支选择。例如:
* `switch (表达式) { case 值 1: 语句块 1; break; case 值 2: 语句块 2; break; ... default: 语句块 n; break; }`
* 每个 `case` 后跟一个值,当表达式与某个值相等时执行对应的语句块。`default` 是可选的,用于处理所有不匹配的情况。在 C# 7.0 及以上版本中,`switch` 的 `case` 分支可以使用模式匹配,例如:`case int i:` 表示当表达式结果是整数时匹配。
2. **循环语句**
* `for` 循环:`for (初始化; 条件; 迭代) { 语句块 }`。先执行初始化语句,然后在每次循环前检查条件,若条件为 `true` 执行语句块,最后执行迭代语句。
* `while` 循环:`while (条件) { 语句块 }`,条件为 `true` 时重复执行语句块。
* `do-while` 循环:`do { 语句块 } while (条件);`,先执行语句块,然后再检查条件,至少执行一次语句块。
* `foreach` 循环:用于遍历数组或集合中的元素。例如:`foreach (类型 变量名 in 集合) { 语句块 }`,`变量名` 依次取集合中的每个元素。
## 五、数组和集合
1. **数组**
* 一维数组:声明格式为 `类型[] 数组名 = new 类型[长度];` 例如:`int[] numbers = new int[5];` 可以通过索引(从 0 开始)访问数组元素,如 `numbers[0]`。
* 二维数组:声明格式为 `类型[,] 数组名 = new 类型[行数, 列数];` 例如:`int[,] matrix = new int[3, 4];` 访问元素如 `matrix[0, 0]`。
* 尽量避免使用 `var` 声明数组,例如 `var arr = new[] {1, 2, 3};` 会导致数组类型推断为 `int[]`,但不如直接用 `int[] arr = new int[]{1, 2, 3};` 清晰明确。
2. **集合** :例如 `List<T>`,是一种更灵活的数组实现,可以动态调整大小。需要引用 `System.Collections.Generic` 命名空间。例如:`List<int> list = new List<int>(); list.Add(1); list.Add(2);` 等。
## 六、类型转换
1. **隐式类型转换** :安全的转换,不会导致数据丢失。例如:`int x = 10; long y = x;` 将 `int` 类型转换为 `long` 类型。
2. **显式类型转换** :可能会导致数据丢失或异常,需在转换前检查是否安全。例如:`double price = 99.9; int roundedPrice = (int)price;` 将 `double` 类型转换为 `int` 类型,小数部分被舍弃。
3. **使用 `Convert` 类进行转换** :例如:`string numberStr = "123"; int parsedNumber = Convert.ToInt32(numberStr);` 可以进行各种类型之间的转换,但要确保转换有效,否则会抛出异常。
4. **类型检查与转换** :使用 `is` 运算符检查对象是否为某个类型,如 `if (obj is int) { ... }`。使用 `as` 运算符进行安全的类型转换,如 `int? number = obj as int?;`,若转换失败返回 `null`。