优化SHA,未传入key时,仅对数据进行哈希,不做消息认证
|
# NewLife Copilot å作指令
本说明适用于新生命团队(NewLife)åŠå…¶å…¨éƒ¨å¼€æº / è¡ç”Ÿé¡¹ç›®ã€‚本指令用于规范在这些项目ä¸ä½¿ç”¨ Copilot(åŠç±»ä¼¼æ™ºèƒ½åŠ©æ‰‹ï¼‰æ—¶çš„è¡Œä¸ºï¼Œä¸»è¦é¢å‘ C# / .NET æŠ€æœ¯æ ˆã€‚
## 1. ç›®æ ‡
- ææ•ˆï¼šå‡å°‘æœºæ¢°æ ·æ¿åŠ³åŠ¨ï¼Œèšç„¦ä¸šåŠ¡/æ ¸å¿ƒç®—æ³•ã€‚
- ä¸€è‡´ï¼šé£Žæ ¼ã€ç»“æž„ã€å‘½åã€API 行为稳定。
- å¯æŽ§ï¼šé™åˆ¶æ”¹åЍ影å“é¢ã€å¯å®¡è®¡ã€å…¼å®¹å‹å¥½ã€ä¸å¼•å…¥éšæ‚£ã€‚
- å¯é :é¿å…虚构ã€ä¿æŒæ€§èƒ½ã€ä¸ç ´å现有åˆçº¦ã€‚
## 2. 适用范围
- å« NewLife 组件或其è¡ç”Ÿçš„全部 C# / .NET 仓库。
- ä¸å«çº¯å‰ç«¯ / éž .NET / 市场文案。
- å˜åœ¨æœ¬æ–‡ä»¶ → å¿…é¡»éµå¾ªï¼›ç¼ºå¤±å¯å¼•入。
## 3. 角色与èŒè´£
- å¼€å‘者:æå‡ºæ¸…晰需求(功能/缺陷/性能/釿ž„/文档)。
- Copilot:先检索å†ç”Ÿæˆï¼›è¾“出必è¦ä¸”å½±å“é¢å—控的改动;ä¸è™šæž„ï¼›ç®€ä½“ä¸æ–‡å›žå¤ã€‚
- å®¡æ ¸å…³é”®ç‚¹ï¼šå…¬å…± APIã€ä¸€è‡´æ€§ã€æ€§èƒ½å½±å“。
## 4. 工作æµ
1) 需求分类 → 功能 / ä¿®å¤ / 性能 / 釿ž„ / 文档
2) 检索 → 相关类型ã€ç›®å½•ã€æ–¹æ³•ã€å·²æœ‰æ‰©å±•/工具
3) 评估 → 是å¦å…¬å…± API / æ˜¯å¦æ€§èƒ½çƒç‚¹
4) 设计 → 列出改动点 + 兼容/é™çº§ç–ç•¥
5) 实施 → 局部编辑,é™åˆ¶æ”¹åЍ影å“é¢ï¼›ä¿ç•™åŽŸæ³¨é‡Šä¸Žç»“æž„
6) éªŒè¯ â†’ 通过编译;自动è¿è¡Œä¸Žæœ¬æ¬¡æ”¹åŠ¨ç›¸å…³çš„å•元测试;若未å‘çŽ°ä»»ä½•ç›¸å…³æµ‹è¯•ï¼Œåœ¨ç»“æžœä¸æ˜Žç¡®è¯´æ˜Žï¼›ä¸å¾—自动新增测试项目
7) 说明 → å˜æ›´æ‘˜è¦ / å½±å“范围
8) æäº¤ → ç»Ÿä¸€æ ¼å¼ï¼Œæ•´ç†ä¸æ–‡æäº¤æ—¥å¿—ï¼›ç¦æ¢å¤¹å¸¦æ— å…³æ ¼å¼åŒ–
## 5. ç¼–ç 规范
- è¯è¨€ï¼š`<LangVersion>latest</LangVersion>`,使用最新C#è¯æ³•特性。
- 命å:类型/公共æˆå‘˜ PascalCaseï¼›å‚æ•°/局部 camelCaseï¼›ç§æœ‰å—段 `_xxx`ï¼ˆä¸”å—æ®µåº”紧邻其对应的属性之å‰ï¼Œè§ä¸‹è¿°â€œå°±è¿‘规则â€ï¼‰ã€‚
- 类型å用 .NET æ£å¼å(`String`/`Int32`),é¿å…别å。
- å•行 if:仅å•è¯å¥åŒä¸€è¡Œï¼›å¤šåˆ†æ”¯å•è¯å¥ä¸åŠ èŠ±æ‹¬å·ã€‚
- 循环(`for/foreach/while/do`)å³ä½¿å¾ªçޝ体当å‰åªæœ‰å•一è¯å¥ï¼Œä¹Ÿå¿…é¡»ä¿ç•™ `{}` 花括å·ï¼ˆé™¤éžåŽŸå§‹ä»£ç æœ¬å°±æ— 括å·ï¼‰ï¼Œé¿å…未æ¥å¢žé‡å¯¼è‡´éšè—逻辑或åˆå¹¶å†²çªï¼›ç¦æ¢ä¸ºæ‰€è°““简æ´â€è€Œç§»é™¤ã€‚
- æ¯æ–‡ä»¶ä¸€ä¸ªä¸»è¦å…¬å…±ç±»åž‹ï¼›å¹³å°å·®å¼‚使用 `partial`。
- 忌全é‡é‡æŽ’ã€æ— å·®å¼‚æ ¼å¼åŒ–æäº¤ã€‚
- Linqã€å射仅用于éžé«˜é¢‘路径;çƒç‚¹ä½¿ç”¨æ‰‹å†™å¾ªçޝ/缓å˜ã€‚
- 使用 file-scoped namespace。
- ç¦æ¢æ“…è‡ªåˆ é™¤å·²æœ‰ä»£ç æ³¨é‡Šï¼ˆå«å•行 // 与 XML 文档注释),å¯ä»¥ä¿®æ”¹æˆ–è¿½åŠ ï¼›ç¦æ¢å•独“清ç†â€ä¸€ç‰‡æ³¨é‡Šå—æˆ–ä»…åˆ é™¤ç©ºç™½è¡Œæ¥åˆ¶é€ 差异。
- ä¸å¾—ä»…ä¸ºå¯¹é½æˆ–所谓美观批é‡ç§»é™¤ã€åˆå¹¶ç©ºç™½è¡Œï¼›ä¿ç•™æœ‰æ„的逻辑分隔空行。仅在åŒä¸€å±€éƒ¨æœ‰çœŸå®žä»£ç å¢žåˆ ä¸”éœ€è¦ä¿æŒç»Ÿä¸€æ—¶æ‰å¯é€‚度调整。
### 5.1 å¯è¯»æ€§ä¼˜å…ˆï¼ˆå°±è¿‘)
- 局部å˜é‡å°±è¿‘声明:在首次使用å‰çš„æœ€è¿‘ä½ç½®å£°æ˜Žï¼Œé¿å…集ä¸åœ¨æ–¹æ³•开头。
- å—æ®µç´§é‚»å±žæ€§ï¼šç§æœ‰å—段命å `_xxx`,并紧贴使用它的属性之å‰ï¼Œå‡å°‘è·¨è·é˜…读。
- æŒ‰ç”¨é€”æ”¾ç½®å—æ®µï¼šè‹¥æŸç§æœ‰å—段仅被å•一方法使用(如 `TimerX _timer`),优先放在该方法之å‰ï¼›è‹¥è¢«å¤šæ–¹æ³•å…±äº«ï¼Œåˆ™é›†ä¸æ”¾åœ¨ `#region 属性` 段的末尾,便于统一æµè§ˆä¸Žç»´æŠ¤ã€‚
- æˆç»„排布:相关æˆå‘˜æŒ‰ä¾èµ–é¡ºåºæˆç»„摆放,é™ä½Žè·³è½¬æˆæœ¬ã€‚
- åˆç†ä¾‹å¤–:如会导致é‡å¤å£°æ˜Žã€é—包æ•èŽ·æˆ–å½±å“æ€§èƒ½/ç”Ÿå‘½å‘¨æœŸï¼Œå¯æƒè¡¡ä½ç½®å¹¶åŠ ç®€çŸæ³¨é‡Šã€‚
å†²çªæ—¶ä»¥â€œæ˜“读易懂â€ä¸ºå…ˆã€‚
### 5.2 现代 C# è¯æ³•å好(优先)
- 使用 switch 表达å¼ä¸Žæ¨¡å¼åŒ¹é…ï¼ˆå« relationalã€logicalã€property/positional patterns)。
- 使用集åˆè¡¨è¾¾å¼ä¸Žç®€åŒ–åˆå§‹åŒ–(C# 12):`[]`ã€`[..spread]`ã€`"key" => value`。
- ä½¿ç”¨ç›®æ ‡ç±»åž‹ newã€æ–‡ä»¶ä½œç”¨åŸŸå‘½å空间ã€`init`/`required` æˆå‘˜ã€record/record struct。
- 使用æ’值原始多行å—符串与 `using var` 声明å‡å°‘æ ·æ¿ä»£ç 。
示例(简æ´ä¼˜å…ˆï¼‰ï¼š
```csharp
// 文件作用域命å空间
namespace Demo;
public readonly record struct User(string Name, int Age);
static string Describe(int code) => code switch
{
200 => "OK",
>= 400 and < 500 => "ClientError",
>= 500 => "ServerError",
_ => "Other"
};
// 集åˆè¡¨è¾¾å¼ï¼ˆC# 12)
var baseList = [1, 2, 3];
List<int> list = [..baseList, 4];
Dictionary<string, int> map = ["a" => 1, "b" => 2];
// ç›®æ ‡ç±»åž‹ new 与 using 声明
using var ms = new MemoryStream();
List<User> users = [];
```
## 6. 文档注释
- `public` / `protected` 必须具备注释:`<summary>` å•行简æ´ï¼›è¯¦ç»†æè¿°æ”¾ `<remarks>`;补充 `<param>` `<returns>`。
- `<summary>` 与 `</summary>` 必须在åŒä¸€è¡Œï¼Œç¤ºä¾‹ï¼š`<summary>开始æœåŠ¡</summary>`;除éžå†…容确需多段è½ï¼Œéžå¿…è¦ä¸å¾—使用三行(上下å„ç‹¬ç«‹ï¼‰æ ¼å¼ã€‚
- 示例å¯è£å‰ªï¼›é¿å…泄露密钥ã€çœŸå®žå†…部地å€ã€‚
- `[Obsolete]` æˆå‘˜å¿…é¡»å«è¿ç§»å»ºè®®ã€‚
- 䏿–‡ä¼˜å…ˆï¼Œå¿…è¦æ—¶è¡¥ç²¾ç®€è‹±æ–‡ï¼ˆåŒä¸€ `<remarks>`)。
## 7. 异æ¥ä¸Žæ€§èƒ½
- å¼‚æ¥æ–¹æ³•åŽç¼€ `Async`ï¼›ç¦æ¢ä¼ªå¼‚æ¥åŒ…装。
- 库内部默认 `ConfigureAwait(false)`。
- é«˜é¢‘è·¯å¾„ä¼˜å…ˆï¼šå¯¹è±¡æ± / `ArrayPool<T>` / `Span`ï¼›é¿å…多余分é…与装箱。
- ç¦æ¢åœ¨çƒç‚¹å¼•入未缓å˜åå°„ / åŠ¨æ€ / 夿‚ Linq。
- æ± åŒ–èµ„æºï¼šæ˜Žç¡®èŽ·å–/归还;异常分支ä¸é—失归还。
## 8. 日志与追踪
- æ”¯æŒæ³¨å…¥ï¼š`ILog Log`,å¯é€‰ `ITracer Tracer`。
- 关键过程建 Tracer?.NewSpan åŸ‹ç‚¹ï¼›å¼‚å¸¸æ ‡è®°é”™è¯¯æ ‡ç¾ã€‚
## 9. 错误处ç†
- 精准异常类型;é¿å…未处ç†ç›´æŽ¥ `throw;`。
- 傿•°æ ¡éªŒï¼šç©º / 越界 / æ ¼å¼ã€‚
- ä¸ç”¨å¼‚常作常规分支 → æä¾› `TryXxx`。
- 对外异常信æ¯ä¸å«å†…部实现/路径。
- 类型转æ¢ä¼˜å…ˆçŽ°æœ‰æ‰©å±•ï¼š`ToInt` / `ToBoolean` ç‰ã€‚
## 10. 测试
- 框架:xUnit;命å `{ClassName}Tests`。
- `[DisplayName]` 䏿–‡æè¿°æ„图;æ–言è¯ä¹‰æ¸…晰。
- IO 用临时目录;端å£ç”¨ 0 / éšæœºã€‚
- 覆盖:æ£å¸¸ / 边界 / 异常 / å¹¶å‘ç«žäº‰ï¼ˆå¿…è¦æ—¶ï¼‰ã€‚
- æ€§èƒ½æ•æ„Ÿä»£ç :最å°åŸºå‡†éªŒè¯æˆ–引用基线结果(ä¸ä¼ªé€ æ•°æ®ï¼‰ã€‚
- 选择性执行:默认仅è¿è¡Œä¸Žæ”¹åŠ¨ç›¸å…³çš„æµ‹è¯•ï¼›ä¼˜å…ˆåœ¨å½“å‰è§£å†³æ–¹æ¡ˆä¸æ£€ç´¢ `{ClassName}` 的引用,若引用è½å…¥å•元测试(测试项目或测试目录)则è¿è¡Œè¿™äº›æµ‹è¯•;若未命ä¸ï¼Œå†åœ¨è§£å†³æ–¹æ¡ˆå†…查找 `{ClassName}Tests.cs`(如 `SpanReader` ↔ `SpanReaderTests.cs`)。
- 未å‘çŽ°ç›¸å…³æµ‹è¯•ï¼šåœ¨ç»“æžœä¸æ˜Žç¡®è¯´æ˜Žâ€œæœªåŒ¹é…到相关测试â€ï¼Œä¸”ä¸è‡ªåŠ¨åˆ›å»º/引入测试项目。
## 11. Copilot 使用守则
- 仅回ç”å¼€å‘相关;éžå¼€å‘ → “我是编程助手â€ã€‚
- è¾“å‡ºå‰æ£€ç´¢ï¼›ç¦æ¢é‡å¤é€ è½®å。
- ä¸ç”Ÿæˆè¶…å‡ºéœ€æ±‚çš„å¤§å—æ¨¡æ¿ï¼Œå…ˆåˆ—方案å†å®žçŽ°ã€‚
- 䏿–°å¢žå¤–部ä¾èµ–(除éžè¯´æ˜Žå†…ç½®ä¸è¶³å¹¶ç»™å‡ºæƒè¡¡ï¼‰ã€‚
- é‡ä¸ç¡®å®šä¸Šä¸‹æ–‡ → æ ‡è®°â€œéœ€æŸ¥çœ‹æ–‡ä»¶â€ã€‚
- ä¸ä¼ªé€ :测试结果 / æ€§èƒ½æ•°æ® / 外部调用。
- å›žç”æˆ–ä¿®æ”¹ä»£ç æ—¶ï¼Œä¸å¾—移除已有注释文本,å¯ä»¥ä¿®æ”¹æˆ–è¿½åŠ ï¼›ä¸å¾—å•ç‹¬åˆ é™¤æ•´æ®µæ³¨é‡Šæˆ–ä»…åˆ é™¤ç©ºç™½è¡Œåˆ¶é€ â€œæ ¼å¼ä¼˜åŒ–â€å¼æäº¤ã€‚
- è¿›è¡Œå¾ªçŽ¯ã€æŽ§åˆ¶æµç»“构调整时,若原代ç å«å¾ªçŽ¯èŠ±æ‹¬å·ï¼ˆå³ä¾¿å•è¯å¥ä½“),须ä¿ç•™ï¼Œä¸å¾—擅自移除。
- 修改或æäº¤ä»£ç åŽï¼Œéœ€è‡ªåŠ¨åœ¨æœ¬åœ°è¿è¡Œä¸Žæ”¹åŠ¨ç›¸å…³çš„å•元测试并确ä¿é€šè¿‡ï¼›è‹¥æ— 法定ä½ç›¸å…³æµ‹è¯•,å†è¿è¡Œæœ€å°å¿…è¦é›†åˆæˆ–å…¨éƒ¨ï¼›è‹¥æœªæ‰¾åˆ°ä»»ä½•æµ‹è¯•ï¼Œéœ€åœ¨ç»“æžœä¸æ˜Žç¡®è¯´æ˜Žä¸”ä¸è‡ªåŠ¨æ–°å¢žæµ‹è¯•é¡¹ç›®ã€‚
- ç”Ÿæˆæ–‡æ¡£ï¼šæœªç‰¹åˆ«æŒ‡æ˜Žæ—¶ï¼Œé»˜è®¤ä»¥ Markdown(.mdï¼‰æ ¼å¼è¾“出,并使用 UTF-8 ç¼–ç 。
## 12. å˜æ›´ä¸Žå®¡æ ¸è¯´æ˜Ž
æäº¤æˆ–ç”å¤éœ€åŒ…å«ï¼š
- 概述:åšäº†ä»€ä¹ˆ / 为什么
- å½±å“:公共 API?性能?
- 兼容:é™çº§ç–ç•¥ / æ¡ä»¶ç¼–译点
- 风险:潜在回归 / 性能开销
- åŽç»ï¼šæ˜¯å¦è¡¥æµ‹è¯• / 文档
## 13. ç¦æ¢æ¸…å•
- 虚构 API / 文件 / 类型
- 未检索å³é‡å†™æˆ–é‡å¤å®žçް
- æ“…è‡ªåˆ é™¤å…¬å…± / å—ä¿æŠ¤æˆå‘˜
- 引入é‡å¤ç¬¬ä¸‰æ–¹åŠŸèƒ½åº“
- ä¼ªé€ æµ‹è¯•/性能数æ®
- 在çƒç‚¹è·¯å¾„æ·»åŠ é«˜åˆ†é… LINQ/åå°„ï¼ˆæ— ç¼“å˜ï¼‰
- è¾“å‡ºæ•æ„Ÿå‡æ®/内部地å€
- 未审计第三方片段直接贴入
- å°†éžç¡®å®šæ€§è¡Œä¸ºç›´æŽ¥æ–言(时间/éšæœºï¼‰ä¸éš”离
- 强行异æ¥åŒ–çº¯åŒæ¥é€»è¾‘
- 大é¢ç§¯æ ¼å¼åŒ–æ— ä¸šåŠ¡ä»·å€¼
- æ“…è‡ªåˆ é™¤å·²æœ‰ä»£ç æ³¨é‡Š
- ä»…åˆ é™¤æˆ–åˆå¹¶ç©ºç™½è¡Œä»¥åˆ¶é€ “å˜åŒ–â€
- åˆ é™¤å·²æœ‰ `for/foreach/while/do` å•行循环体的花括å·
## 14. 术è¯è¯´æ˜Ž
- çƒç‚¹è·¯å¾„ï¼šç»æ€§èƒ½åˆ†æžæˆ–é«˜é¢‘è°ƒç”¨æ ˆç¡®è®¤çš„å…³é”®æ‰§è¡Œæ®µã€‚
- åŸºçº¿ï¼šå˜æ›´å‰çš„功能/性能å‚考数æ®ã€‚
---
(完)
|