com um clique
ngaq-code-review
審查C#代碼
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
審查C#代碼
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
審查C#代碼(前端專用)
業務模塊文檔讀寫規範。涉及業務代碼的讀或寫時需要使用此技能
編寫C#代碼
調試 debug。在代碼有問題時使用此skill、通常不需要在開發編碼階段使用此skill
生成帶註釋的 C# 代碼。當編寫新的 C# 代碼時使用。
| name | ngaq-code-review |
| description | 審查C#代碼 |
該規範不包含前端相關。若要看前端相關代碼規範、請看 .agents/skills/ngaq-code-review-frontend/SKILL.typ
功能正確性是最關鍵的。先自己通過觀察判斷是否存在缺陷。
異步函數不使用任何後綴、約定 最後一個參數聲明爲 CT Ct的即異步函數
函數參數首字母也要大寫!
所有代碼必須兼容AOT編譯!禁止使用不兼容AOT的寫法、 包括但不限于 運行時動態反射API, 不兼容AOT的第三方庫等。 (依賴注入的IJsonSerializer, ToolJson等是兼容AOT的)
除非特殊情況、禁止用.Result或其他方式把異步轉同步
DoSomething() {
// step 1: xxx
......
// step 2: yyy
}
(注意、此項目約定 Bat開頭的批量查詢函數、返回順序和入參順序是一一對應的)
批量操作函數 接收的參數 首選 IAsyncEnumerable<T>。
當使用可迭代集合而非IList時、要求空間複雜度爲O(常數)。 (把可迭代集合 分批次結合 BatchCollector 使用、即使在BatchCollector內積存本批次、也把空間複雜度視爲O(常數))
對于可迭代集合、謹慎使用.ToList()或類似API 因爲這會把所有元素都載入內存! 也不要自己用foreach消費然後開List積攢起來(這和ToList其實一樣)
需要操作內部元素旹盡量使用.Select保持懶加載
注意 可迭代集合 只允許消費一遍 不允許多次消費
Stream亦同理、默認需要懶加載、不能把全部數據都一次性載入內存、不能用MemoryStream接收
錯誤示例:
void fn(IDbUserCtx Ctx, IAsyncEnumerable<MyObj> Itbl, CT Ct){
await foreach(var obj in Itbl){
//這種情況是 拆散批量 變逐個傳 性能極差
BatHandleObj(Ctx, ToolAsyE.ToAsyE([obj]), Ct);
}
}
正確示例: 用BatchCollector。 除上述之外 也要檢查有無其他性能問題。 重點考慮時間複雜度和空間複雜度。
對擴展開放、對修改封閉
把抽象層接口的實現類替換成其他實現類 不應該影響其功能的正確性。 實現接口時應當注意這一點。實現的方法 語義和行爲要一致
不要強迫一個實現類實現他不該實現的方法。如果出現了這種情況即需考慮把大接口細分成小接口。
禁止字符串硬編碼鍵名。禁止魔法字符串 魔法數字。 多用 nameof / 枚舉 / 自己實現枚舉
若你發現一段代碼 可能具有比較廣泛的適用性 (比如一些純函數, 工具函數等): 先查找當前項目中有沒有已封裝好的現成的
GetService<MyService>()來獲取依賴!你應該使用構造函數依賴注入
App.DiOrMk<Ctx>() 等必須使用 ItemsErr 中定義的異常種類、不要硬編碼異常信息。 若是快速開發中的臨時硬編碼異常信息 就用 Todo.I18n(異常信息)。
正確示例:
if(_UserId.IsNullOrDefault()){
throw ItemsErr.User.AuthenticationFailed.ToErr();
}
或 快速開發時臨時硬編碼
if(_UserId.IsNullOrDefault()){
throw new Exception(Todo.I18n("AuthenticationFailed"));
}
錯誤示例
if(_UserId.IsNullOrDefault()){
throw new Exception("AuthenticationFailed");
//拋其他種類的異常也不允許、要麼你就用ItemsErr中定義的強類型異常、要麼你就用Todo.I18n()
}
重點檢查位置: 檢查Svc層。 添加或修改操作 可能拋出
[Obsolete])檢查代碼中有無安全漏洞。
實現了 I_Owner 接口的實體、要用 I_Owner.CheckOwner 擴展方法過一遍 來檢查Owner和當前UserId是否匹配
相似的場景應採用相似的處理、保持一致性。 除非特殊原因、若發現不一致的地方 應提出。
確保Ngaq.Core和Ngaq.Ui兩個程序集 是 平臺無關的(即跨平臺的、包括Web平臺) 禁止直接在 Ngaq.Ui 裏面使用任何 非跨平臺的API 如
.WhereNonDel()
WithDel後綴### 構建Sql
能用SqlSplicer就不要用事符串插值上述內容只列舉了幾個常見的檢查點。 對于上面未列舉 但你自己覺得有問題的 也要提出。
默認情況下、直接把代碼中不符合規範的內容報告給用戶、不需要自行修改代碼。
如果用戶已經要求你自行迭代修改代碼 那就自行修改。改完一版之後再讀此文件對照評審。