差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
| csharp:框架 [2025/11/20 14:58] – 张叶安 | csharp:框架 [2025/11/21 08:54] (当前版本) – 张叶安 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | < | + | ====== |
| - | + | ||
| - | ## 框架 | + | |
| .net 读 dot net | .net 读 dot net | ||
| - | ```csharp | + | < |
| using System ; // | using System ; // | ||
| namespace 控制台 ; // | namespace 控制台 ; // | ||
| class Program ; //class 用于声明一个类 | class Program ; //class 用于声明一个类 | ||
| - | ``` | + | </ |
| 使用中建议、类名称与文件名保持一样 尽量一个类一个文件 | 使用中建议、类名称与文件名保持一样 尽量一个类一个文件 | ||
| - | ## 一、命名规范 | + | ====== |
| - | ### 1. 大小写风格 | + | |
| - | - PascalCase | + | ===== 1. 大小写风格 ===== |
| - | 用于:类、接口、结构、枚举、属性、方法、事件、命名空间 | + | |
| - | 例:`OrderService`、`GetUserInfo()`、`UserName` | + | |
| - | - camelCase | + | * **PascalCase** |
| - | 用于:参数、局部变量 | + | * 用于:类、接口、结构、枚举、属性、方法、事件、命名空间 |
| - | 例:`userId`, `totalCount` | + | * 例:'' |
| + | | ||
| + | * 用于:参数、局部变量 | ||
| + | | ||
| + | * **带下划线camelCase** | ||
| + | * 用于:私有字段(Roslyn、.NET Runtime 推荐) | ||
| + | * 例:'' | ||
| + | * **SCREAMING_CASE** | ||
| + | * 用于:常量、'' | ||
| + | * 例:'' | ||
| - | - 带下划线camelCase | + | ===== 2. 接口命名 ===== |
| - | 用于:私有字段(Roslyn、.NET Runtime 推荐) | + | |
| - | 例:`_logger`, | + | |
| - | - SCREAMING_CASE | + | * 接口必须以 **I** 开头 |
| - | 用于:常量、`static readonly` 字段 | + | |
| - | 例:`DEFAULT_BUFFER_SIZE`; | + | |
| - | + | ||
| - | ### 2. 接口命名 | + | |
| + | ===== 3. 枚举命名 ===== | ||
| - | - 接口必须以 | + | |
| - | | + | |
| + | <code csharp> | ||
| + | enum FileState { Open, Closed, Locked } | ||
| + | </ | ||
| - | ### 3. 枚举命名 | + | ===== 4. 命名空间 ===== |
| - | - 枚举类型:PascalCase | + | * PascalCase |
| - | - 枚举成员:PascalCase | + | |
| - | - 不使用前缀(如 `Enum_`) | + | |
| - | | + | |
| - | enum FileState { Open, Closed, Locked } | + | |
| - | ``` | + | |
| - | ### 4. 命名空间 | + | ---- |
| - | - PascalCase | + | |
| - | - 公司或组织级前缀 | + | |
| - | 示例:`Microsoft.Extensions.Logging` | + | |
| - | --- | + | ====== 二、代码布局与格式 ====== |
| - | ## 二、代码布局与格式 | + | ===== 1. 缩进与空白 ===== |
| - | ### 1. 缩进与空白 | + | |
| - | - 标准缩进 | + | < |
| - | - 不使用 Tab | + | DoWork(item, |
| - | - `, ; { }` 后加空格;方法调用括号内无空格 | + | </ |
| - | ```csharp | + | |
| - | DoWork(item, | + | |
| - | ``` | + | |
| - | ### 2. 大括号(Brace)风格 | + | ===== 2. 大括号(Brace)风格 |
| - | 使用 Allman 风格(每个 | + | |
| - | ```csharp | + | 使用 Allman 风格(每个 |
| + | < | ||
| public void Run() | public void Run() | ||
| { | { | ||
| ... | ... | ||
| } | } | ||
| - | ``` | + | </ |
| - | ### 3. 空行规则 | + | ===== 3. 空行规则 |
| - | - 成组代码块之间使用 1 行空行 | + | |
| - | - 方法之间留 1 行空行 | + | |
| - | - 不要连续多个空行 | + | |
| - | --- | + | * 成组代码块之间使用 1 行空行 |
| + | * 方法之间留 1 行空行 | ||
| + | * 不要连续多个空行 | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== 三、成员排序(微软推荐顺序) ====== | ||
| - | ## 三、成员排序(微软推荐顺序) | ||
| 类内部成员推荐顺序: | 类内部成员推荐顺序: | ||
| - | 1. 常量 | + | - 常量 |
| - | 2. 静态字段 | + | |
| - | 3. 字段 | + | |
| - | 4. 构造函数 | + | |
| - | 5. 属性 | + | |
| - | 6. 事件 | + | |
| - | 7. 方法 | + | |
| - | 8. 嵌套类型 | + | - 嵌套类型 |
| + | |||
| + | <code csharp> | ||
| + | # region 常量 | ||
| + | |||
| + | # endregion | ||
| + | |||
| + | # region 静态字段 | ||
| + | |||
| + | # endregion | ||
| + | |||
| + | # region 字段 | ||
| + | |||
| + | # endregion | ||
| + | |||
| + | # region 构造函数 | ||
| + | |||
| + | # endregion | ||
| + | |||
| + | # region 属性 | ||
| + | |||
| + | # endregion | ||
| + | |||
| + | # region 事件 | ||
| + | |||
| + | # endregion | ||
| + | |||
| + | # region 方法 | ||
| + | |||
| + | # endregion | ||
| + | |||
| + | # region | ||
| + | |||
| + | # endregion | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== 四、表达式与语言特性 ====== | ||
| - | --- | + | ===== 1. var 使用 ===== |
| - | ## 四、表达式与语言特性 | + | * 仅当类型明确或无关紧要时使用 var |
| + | <code csharp> | ||
| + | var list = new List< | ||
| + | </ | ||
| + | * 如果不明显,使用显式类型: | ||
| + | <code csharp> | ||
| + | int count = GetCount(); | ||
| + | </ | ||
| - | ### 1. var 使用 | + | ===== 2. 表达式体成员 ===== |
| - | - 仅当类型明确或无关紧要时使用 var | + | |
| - | ```csharp | + | |
| - | var list = new List< | + | |
| - | ``` | + | |
| - | - 如果不明显,使用显式类型: | + | |
| - | ```csharp | + | |
| - | int count = GetCount(); | + | |
| - | ``` | + | |
| - | ### 2. 表达式体成员 | + | * 适用于简单成员: |
| - | 适用于简单成员: | + | < |
| - | ```csharp | + | |
| public int Count => _items.Count; | public int Count => _items.Count; | ||
| public override string ToString() => Name; | public override string ToString() => Name; | ||
| - | ``` | + | </ |
| - | ### 3. Lambda 风格 | + | ===== 3. Lambda 风格 ===== |
| - | - 简短 lambda 可在一行 | + | |
| - | - 多行 lambda 保持缩进 | + | |
| - | ```csharp | + | |
| - | items.Where(x | + | |
| - | { | + | |
| - | return x.Enabled; | + | |
| - | }); | + | |
| - | ``` | + | |
| - | --- | + | * 简短 lambda 可在一行 |
| + | * 多行 lambda 保持缩进 | ||
| + | <code csharp> | ||
| + | items.Where(x => | ||
| + | { | ||
| + | return x.Enabled; | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== 五、可读性规范 ====== | ||
| + | |||
| + | ===== 1. 方法长度 ===== | ||
| + | |||
| + | * 尽量短小,一个方法保持单一职责 | ||
| + | |||
| + | ===== 2. 参数顺序 ===== | ||
| - | ## 五、可读性规范 | + | * 必选参数在前,可选参数在后 |
| + | * '' | ||
| + | <code csharp> | ||
| + | public Task RunAsync(int id, CancellationToken cancellationToken); | ||
| + | </ | ||
| - | ### 1. 方法长度 | + | ===== 3. 布尔命名 ===== |
| - | - 尽量短小,一个方法保持单一职责 | + | |
| - | ### 2. 参数顺序 | + | * 使用肯定句:'' |
| - | - 必选参数在前,可选参数在后 | + | |
| - | - `CancellationToken` 必须是最后一个参数: | + | |
| - | | + | |
| - | public Task RunAsync(int id, CancellationToken cancellationToken); | + | |
| - | ``` | + | |
| - | ### 3. 布尔命名 | + | ---- |
| - | - 使用肯定句:`isReady`, | + | |
| - | 避免:`isNotValid`, | + | |
| - | --- | + | ====== 六、注释规范 ====== |
| - | ## 六、注释规范 | + | ===== 1. 文档注释 |
| - | ### 1. 文档注释 XML | ||
| 公共 API 必须有 XML 注释: | 公共 API 必须有 XML 注释: | ||
| - | ```csharp | + | < |
| /// < | /// < | ||
| /// 获取用户信息。 | /// 获取用户信息。 | ||
| /// </ | /// </ | ||
| public User GetUser(int id) { ... } | public User GetUser(int id) { ... } | ||
| - | ``` | + | </ |
| + | |||
| + | ===== 2. 行注释 ===== | ||
| - | ### 2. 行注释 | ||
| 只用于解释复杂逻辑,避免写显而易见的注释。 | 只用于解释复杂逻辑,避免写显而易见的注释。 | ||
| - | --- | + | ---- |
| - | ## 七、异常与错误处理 | + | ====== |
| - | ### 1. 异常名称 | + | ===== 1. 异常名称 |
| - | 继承 Exception 且名称以 Exception 结尾 | + | |
| - | ```csharp | + | 继承 Exception 且名称以 Exception 结尾 |
| + | < | ||
| class InvalidConfigurationException : Exception { } | class InvalidConfigurationException : Exception { } | ||
| - | ``` | + | </ |
| + | |||
| + | ===== 2. 不要使用异常控制流程 ===== | ||
| - | ### 2. 不要使用异常控制流程 | ||
| 避免: | 避免: | ||
| - | ```csharp | + | < |
| try { ... } catch { ... } // 控制逻辑 | try { ... } catch { ... } // 控制逻辑 | ||
| - | ``` | + | </ |
| + | 异常应该保留给意外情况,而不是正常控制流程。 | ||
| - | --- | + | 因为异常的代价比较高 |
| - | ## 八、文件与项目结构 | + | ---- |
| + | |||
| + | ====== | ||
| + | |||
| + | ===== 1. 每个类型单独一个文件 ===== | ||
| - | ### 1. 每个类型单独一个文件 | ||
| 除非: | 除非: | ||
| - | - 小型私有辅助类 | + | * 小型私有辅助类 |
| - | - 局部类型 | + | |
| + | |||
| + | ===== 2. 文件命名 ===== | ||
| - | ### 2. 文件命名 | ||
| 文件名与主类名一致: | 文件名与主类名一致: | ||
| - | ``` | + | <code text> |
| OrderService.cs | OrderService.cs | ||
| - | ``` | + | </ |
| + | |||
| + | ===== 3. using 指令 ===== | ||
| - | ### 3. using 指令 | ||
| 按以下顺序分组——每组之间空一行: | 按以下顺序分组——每组之间空一行: | ||
| - | 1. System.* 命名空间 | + | - System.* 命名空间 |
| - | 2. 第三方包 | + | |
| - | 3. 当前项目命名空间 | + | |
| 示例: | 示例: | ||
| - | ```csharp | + | < |
| using System; | using System; | ||
| using System.Collections.Generic; | using System.Collections.Generic; | ||
| 行 203: | 行 250: | ||
| using MyApp.Core; | using MyApp.Core; | ||
| - | ``` | + | </ |
| - | --- | + | ---- |
| - | ## 九、异步编程规范(微软官方 async 规则) | + | ====== |
| - | ### 1. 异步方法必须以 Async 结尾 | + | ===== 1. 异步方法必须以 Async 结尾 |
| - | ```csharp | + | |
| + | < | ||
| public Task SaveAsync(); | public Task SaveAsync(); | ||
| - | ``` | + | </ |
| + | |||
| + | ===== 2. 仅在使用 await 时将方法标记为 async ===== | ||
| - | ### 2. 仅在使用 await 时将方法标记为 async | + | ===== 3. ConfigureAwait ===== |
| - | ### 3. ConfigureAwait | ||
| 库代码中使用: | 库代码中使用: | ||
| - | ```csharp | + | < |
| await task.ConfigureAwait(false); | await task.ConfigureAwait(false); | ||
| - | ``` | + | </ |
| - | --- | + | ---- |
| - | ## 十、不可变性与集合规范 | + | ====== |
| - | ### 1. 优先使用只读字段 | + | ===== 1. 优先使用只读字段 |
| - | ```csharp | + | |
| + | < | ||
| private readonly ILogger _logger; | private readonly ILogger _logger; | ||
| - | ``` | + | </ |
| + | |||
| + | ===== 2. 公开集合使用 IReadOnlyList / IEnumerable ===== | ||
| - | ### 2. 公开集合使用 IReadOnlyList / IEnumerable | ||
| 避免暴露可变集合类型。 | 避免暴露可变集合类型。 | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## 十一、.NET 代码分析器 StyleCop / Roslyn Style Rules 推荐配置 | ||
| - | 常用微软官方规则: | ||
| - | - SA1600:公开 API 必须 XML 注释 | ||
| - | - IDE0008:使用显式类型(当不明显时) | ||
| - | - IDE0041:使用 is null/ is not null | ||
| - | - IDE0034:简化布尔表达式 | ||
| - | - IDE0060:移除未使用的参数 | ||
| - | |||
| - | |||
| - | </ | ||
| - | |||