.gitignore添加.idea目录和.vscode目录
|
# 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`)。
- **è¯è¨€ç‰ˆæœ¬**:`<LangVersion>latest</LangVersion>`,最大化使用最新 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<String> 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 文档注释
- `<summary>` **å¿…é¡»åŒè¡Œé—åˆ**:`/// <summary>获å–åç§°</summary>`
- æ¯ä¸ªå‚æ•°**必须有** `<param>` æ ‡ç¾ï¼Œæ— 论方法å¯è§æ€§
- 有返回值**必须有** `<returns>`ï¼›å¤æ‚方法å¯å¢žåŠ `<remarks>`
- `public`/`protected` æˆå‘˜å¿…须注释;`[Obsolete]` 必须包å«è¿ç§»å»ºè®®
### 4.6 异æ¥ä¸Žæ€§èƒ½
- å¼‚æ¥æ–¹æ³•åŽç¼€ `Async`,库内部默认 `ConfigureAwait(false)`
- çƒç‚¹è·¯å¾„é¿å…åå°„/夿‚ Linq,优先手写循环/`ArrayPool<T>`/`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# 惯例,**必须用æ£å¼å**)
- åˆ é™¤é˜²å¾¡æ€§æ³¨é‡Šï¼ˆå¸¦è¯´æ˜Žçš„æ³¨é‡Šä»£ç )
- åˆ é™¤å¾ªçŽ¯ä½“çš„èŠ±æ‹¬å·
- å°† `<summary>` 拆æˆå¤šè¡Œ
- æ“…è‡ªåˆ é™¤ `public`/`protected` æˆå‘˜
- 擅自新增外部 NuGet ä¾èµ–(需说明ç†ç”±ï¼‰
- ä»…åˆ é™¤ç©ºç™½è¡Œ/æ³¨é‡Šåˆ¶é€ "æ ¼å¼ä¼˜åŒ–"æäº¤
- 虚构ä¸å˜åœ¨çš„ API/文件/类型
- ä¼ªé€ æµ‹è¯•ç»“æžœ/性能数æ®
- 在çƒç‚¹è·¯å¾„æ·»åŠ æœªç¼“å˜åå°„/夿‚ Linq
- è¾“å‡ºæ•æ„Ÿå‡æ®/内部地å€
- å‘现问题å´è§†è€Œä¸è§
- ç”¨æˆ·è¦æ±‚ä¼˜åŒ–æ—¶ä»…åšæ³¨é‡Š/测试ç‰è¡¨é¢å·¥ä½œ
- **跳过第 1 èŠ‚è§¦å‘æ£€æŸ¥**(命ä¸å…³é”®è¯å´æœªåŠ è½½ä¸“ç”¨æŒ‡ä»¤æ–‡ä»¶ï¼Œæ˜¯æœ€ä¸¥é‡çš„é—æ¼é”™è¯¯ï¼‰
---
## 11. å˜æ›´è¯´æ˜Žæ¨¡æ¿
```markdown
## 概述
åšäº†ä»€ä¹ˆ / 为什么
## å½±å“
- 公共 API:是/å¦
- 性能影å“ï¼šæ— /有(说明)
## 兼容性
é™çº§ç–ç•¥ / æ¡ä»¶ç¼–译点
## 风险与åŽç»
潜在回归 / 是å¦è¡¥æµ‹è¯•
```
---
(完)
|