with one click
ngaq-code-review
審查C#代碼
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
審查C#代碼
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
審查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就不要用事符串插值上述內容只列舉了幾個常見的檢查點。 對于上面未列舉 但你自己覺得有問題的 也要提出。
默認情況下、直接把代碼中不符合規範的內容報告給用戶、不需要自行修改代碼。
如果用戶已經要求你自行迭代修改代碼 那就自行修改。改完一版之後再讀此文件對照評審。