# NewLife Copilot 协作指令
适用于新生命团队(NewLife)全部 C#/.NET 仓库。存在本文件则必须遵循。**简体中文回复。**
通用 C# 最佳实践(设计模式、SOLID、健壮性等)AI 已知,此处不赘述,**仅列出组织专属规则与反常规约定**。
---
## 1. 专用指令(前置检查,必须执行)
**开始任何任务前,必须先将用户请求与下表触发信号逐行匹配。命中则立即用 `get_file` 读取 `.github/instructions/{指令文件}`,读取成功后遵循其中全部规则。未命中任何行才跳过。**
| 触发信号(用户请求含以下任意关键词即命中) | 指令文件 |
|---------|---------|
| XCode/实体生成/Model.xml/数据库 CRUD/`NewLife.XCode` 引用/`*.xcode.xml`/项目名含 `.Data`/`XCode.*` 命名空间/用户提及修改任意 `.xml` 文件 | `xcode.instructions.md` |
| Cube/魔方/Web开发/`NewLife.Cube` 引用/`NewLife.Cube.*` 命名空间 | `cube.instructions.md` |
| 性能测试/基准测试/压力测试/压测/BenchmarkDotNet/Benchmark/benchmark/吞吐量评估/性能分析/性能对比/性能报告/速度对比/速度测试/内存分配/perf/性能优化测试/做性能/跑分/测试报告 | `benchmark.instructions.md` |
| NetServer/NetSession/网络服务器/网络客户端/Socket服务/TCP服务/UDP服务/`NewLife.Net` 引用/`NewLife.Net.*` 命名空间/ISocketClient/ISocketRemote/CreateRemote/StandardCodec/LengthFieldCodec/管道编解码/网络编程/Echo服务/网络会话/长连接/粘包拆包 | `net.instructions.md` |
| 新建系统/新建项目/新增模块/需求整理/需求文档/需求分析/架构设计/技术方案/功能清单/功能拆分/任务分解/迭代开发/迭代计划/验收/PRD/用户故事/做一个系统/做一个平台/开发流程/全部搞完/批量开发/自治模式/一次性做完/继续处理/接着做 | `development.instructions.md` |
---
## 2. 核心原则
检索优先、风格一致、兼容友好、**主动优化**。
发现明显缺陷(资源泄漏、空引用、逻辑错误)时主动修复;优化请求时深入分析,不做表面工作。
改动较小直接做并说明;改动较大(涉及公共 API 或大范围重构)先列方案询问确认。
---
## 3. 兼容性约束(极重要)
NewLife 核心库支持 `.NET 4.5` 至最新版本(`net45` → `net10`)。
- **语言版本**:`latest`,最大化使用最新 C# 语法糖(switch 表达式、集合表达式 `[]`、`?.`/`??`、模式匹配、目标类型 `new`、record 等)
- **禁止高版本专属 BCL API**:❌ `ArgumentNullException.ThrowIfNull()` → ✅ `if (x == null) throw new ArgumentNullException(nameof(x));`
- **条件编译符号**:`NETFRAMEWORK`、`NETSTANDARD2_0`、`NETCOREAPP`、`NET5_0_OR_GREATER`、`NET6_0_OR_GREATER`、`NET8_0_OR_GREATER`
- 新增 API 需评估各框架兼容性,必要时提供条件编译降级实现
---
## 4. 编码规范
### 4.1 类型名(关键差异)
**必须**使用 .NET 正式名:`String`/`Int32`/`Boolean`/`Int64`/`Double`/`Object` 等。
❌ **禁止**使用 C# 别名:`string`/`int`/`bool`/`long`/`double`/`object`
### 4.2 命名
| 成员类型 | 规则 | 示例 |
|---------|------|------|
| 类型/公共成员 | PascalCase | `UserService`、`GetName()` |
| 参数/局部变量 | camelCase | `userName`、`count` |
| 私有字段 | `_camelCase` | `_cache`、`_instance` |
| 扩展方法类 | `xxxHelper` 或 `xxxExtensions` | `StringHelper`、`CollectionExtensions` |
### 4.3 代码风格
- **命名空间**:file-scoped namespace
- **单文件**:每文件一个主要公共类型;较大平台差异使用 `partial`
- **集合初始化**:优先使用集合表达式 `[]`,如 `List Tags { get; set; } = [];`
- **Null 条件运算符**:优先使用 `?.`/`??` 简化空值检查
```csharp
// ✅ 单行 if:单语句且整行不过长时同行
if (value == null) return;
if (key == null) throw new ArgumentNullException(nameof(key));
// ✅ 语句较长时另起一行,仍不加花括号
if (value == null)
throw new ArgumentNullException(nameof(value), "Value cannot be null");
// ✅ 多分支单语句:不加花括号
if (count > 0)
DoSomething();
else
DoOther();
// ✅ 循环必须保留花括号(即使单语句)
foreach (var item in list)
{
Process(item);
}
// ✅ using 优先无花括号声明;仅需生命周期(如锁)时用弃元
using var stream = File.OpenRead("file.txt");
using var _ = _lock.AcquireLock();
```
### 4.4 Region 与日志
较长类使用 `#region` 分段,顺序:`属性` → `静态` → `构造` → `方法` → `辅助` → **`日志`**。
含 `ILog Log` 和 `WriteLog` 时:**必须放类末尾**,用名为"日志"的 region 包裹,不放入"辅助"。
关键过程可使用 `Tracer?.NewSpan()` 埋点。
### 4.5 文档注释
- `` **必须同行闭合**:`/// 获取名称`
- 每个参数**必须有** `` 标签,无论方法可见性
- 有返回值**必须有** ``;复杂方法可增加 ``
- `public`/`protected` 成员必须注释;`[Obsolete]` 必须包含迁移建议
### 4.6 异步与性能
- 异步方法后缀 `Async`,库内部默认 `ConfigureAwait(false)`
- 热点路径避免反射/复杂 Linq,优先手写循环/`ArrayPool`/`Span`
- 池化资源明确获取/归还,异常分支不遗失归还
### 4.7 错误处理
- 精准异常类型:`ArgumentNullException`/`InvalidOperationException` 等
- TryXxx 模式:不用异常作常规分支
- 类型转换:优先使用 `ToInt()`/`ToBoolean()` 等扩展方法
- 对外异常不暴露内部实现/路径
---
## 5. NewLife 内置工具
优先使用项目内置工具而非标准库,**禁止重复造轮子**:
- 字符串构建:`Pool.StringBuilder`(替代 `new StringBuilder()`)
- 时间戳:`Runtime.TickCount64`
- 类型转换:`ToInt()`、`ToBoolean()`、`ToDouble()`、`ToDateTime()` 等扩展方法
- 追踪埋点:`Tracer?.NewSpan()`
---
## 6. 防御性注释(禁止删除)
代码中带有说明文字的被注释代码属于**防御性注释**,记录历史踩坑经验。**禁止删除,禁止"恢复"执行**。可补充更详细说明。
```csharp
// 曾经尝试过同步等待,但会导致线程池饥饿和死锁
// var result = task.Result;
// 不要使用 SendAsync 的无超时重载,否则会造成连接泄漏
// await client.SendAsync(data);
```
---
## 7. 工作流
触发检查(第 1 节触发信号表匹配,命中则读取专用指令) → 检索(**优先复用**现有实现) → 评估(公共 API/兼容性/性能) → 方案 → 实施 → 验证 → 说明
- **触发检查**:开始工作前必须完成,遗漏专用指令将导致输出不符合要求
- **实施**:完成主任务;顺带修复明显缺陷;顺带简化重复代码;保留原注释与结构
- **验证**:代码变更必须编译通过;找到相关测试则运行;仅文档变更可跳过
### 主动优化原则
用户要求**分析/优化代码**时:
| 行动 | 说明 |
|------|------|
| **架构梳理** | 重构不清晰的结构,让代码更易懂 |
| **缺陷修复** | 资源泄漏、空引用、并发问题、逻辑错误 → 直接修复 |
| **代码简化** | 提取重复代码、合并冗余判断、应用现代语法 |
| **性能优化** | 缓存重复计算、池化高频对象、避免无用分配 |
| **注释完善** | 补充缺失的 XML 注释和关键逻辑说明 |
---
## 8. 测试
- 框架 xUnit;类名 `{ClassName}Tests`;方法加 `[DisplayName("中文描述意图")]`
- 网络端口用 `0`/随机,IO 用临时目录
- 先搜索 `{ClassName}` 引用定位测试文件,再找 `{ClassName}Tests.cs`;**未找到需说明**,不自动创建测试项目
---
## 9. 文档与发布
### Markdown 文档
UTF-8 无 BOM;存放 `Doc/` 目录;文件名优先中文。**已有文件必须先读取再增量修改,禁止覆盖。**
### NuGet 版本
| 类型 | 格式 | 示例 |
|------|------|------|
| 正式版 | `{主}.{子}.{年}.{月日}` | `11.9.2025.0701` |
| 测试版 | `{主}.{子}.{年}.{月日}-beta{时分}` | `11.9.2025.0701-beta0906` |
---
## 10. 重要禁止项
以下是 AI 容易犯但在本项目影响严重的错误:
- 将 `String`/`Int32` 改为 `string`/`int`(本项目反 C# 惯例,**必须用正式名**)
- 删除防御性注释(带说明的注释代码)
- 删除循环体的花括号
- 将 `` 拆成多行
- 擅自删除 `public`/`protected` 成员
- 擅自新增外部 NuGet 依赖(需说明理由)
- 仅删除空白行/注释制造"格式优化"提交
- 虚构不存在的 API/文件/类型
- 伪造测试结果/性能数据
- 在热点路径添加未缓存反射/复杂 Linq
- 输出敏感凭据/内部地址
- 发现问题却视而不见
- 用户要求优化时仅做注释/测试等表面工作
- **跳过第 1 节触发检查**(命中关键词却未加载专用指令文件,是最严重的遗漏错误)
---
## 11. 变更说明模板
```markdown
## 概述
做了什么 / 为什么
## 影响
- 公共 API:是/否
- 性能影响:无/有(说明)
## 兼容性
降级策略 / 条件编译点
## 风险与后续
潜在回归 / 是否补测试
```
---
(完)