super-code - SKILL
name: csharpdescription: “Language-specific super-code guidelines for csharp.”risk: safesource: communitydate_added: “2026-06-16”C#惯用高效写法参考何时使用当任务符合以下描述时使用此技能针对 csharp 的语言特定 super-code 指南。目录LINQ 与集合空值处理异步/等待记录与模式匹配错误处理资源管理C# 特有的反模式1. LINQ 与集合 {#linq}// ❌ 命令式累加varresultnewListstring();foreach(variteminitems){if(item.IsActive)result.Add(item.Name.ToUpper());}// ✅varresultitems.Where(ii.IsActive).Select(ii.Name.ToUpper()).ToList();// ❌ 手动分组vargroupednewDictionarystring,ListItem();foreach(variteminitems){if(!grouped.ContainsKey(item.Category))grouped[item.Category]newListItem();grouped[item.Category].Add(item);}// ✅vargroupeditems.GroupBy(ii.Category).ToDictionary(gg.Key,gg.ToList());// ❌ 先 Any() 再 First()if(items.Any(ii.IsValid)){varfirstitems.First(ii.IsValid);}// ✅varfirstitems.FirstOrDefault(ii.IsValid);if(firstisnotnull){...}2 个以上操作的链式调用优先使用方法语法。查询语法适合复杂 join。2. 空值处理 {#nulls}// ❌ 嵌套空值检查stringcitynull;if(user!nulluser.Address!null){cityuser.Address.City;}// ✅varcityuser?.Address?.City;// ❌ 用三元表达式做空值回退varnameuser!null?user.Name:Unknown;// ✅varnameuser?.Name??Unknown;// ❌ 事件调用前做空值检查if(OnChanged!null)OnChanged(this,args);// ✅OnChanged?.Invoke(this,args);// ❌ 手动抛出 ArgumentNullExceptionif(namenull)thrownewArgumentNullException(nameof(name));// ✅ (C# 10)ArgumentNullException.ThrowIfNull(name);在项目范围内启用可空引用类型Nullableenable/Nullable。3. 异步/等待 {#async}// ❌ 阻塞异步代码varresultGetDataAsync().Result;// 死锁风险// ✅varresultawaitGetDataAsync();// ❌ async void异常无法观察asyncvoidOnButtonClick(){awaitDoWork();}// ✅ — async Task只有确实需要的事件处理程序才用 async voidasyncTaskOnButtonClick(){awaitDoWork();}// ❌ 独立工作却顺序 awaitvaraawaitFetchA();varbawaitFetchB();// ✅var(a,b)(awaitTask.WhenAll(FetchA(),FetchB()))switch{varr(r[0],r[1])};// 或用 ValueTuple 更清晰vartaskAFetchA();vartaskBFetchB();varaawaittaskA;varbawaittaskB;// ❌ 在库内部用 Task.Run 包装同步代码publicTaskintGetValue()Task.Run(()ComputeSync());// ✅ — 让调用方决定暴露同步方法publicintGetValue()ComputeSync();库代码中添加ConfigureAwait(false)。应用/UI 代码中省略。4. 记录与模式匹配 {#records}// ❌ 为数据类型手写相等比较、ToString、DeconstructclassPoint{publicintX{get;init;}publicintY{get;init;}// Equals, GetHashCode, ToString...}// ✅ (C# 9)recordPoint(intX,intY);// ❌ 用 if-else 链做类型检查if(shapeisCircle){varc(Circle)shape;returnc.Radius*c.Radius*Math.PI;}elseif(shapeisRectangle){...}// ✅returnshapeswitch{Circle{Radius:varr}r*r*Math.PI,Rectangle{Width:varw,Height:varh}w*h,_thrownewArgumentException($Unknown shape:{shape})};// ❌ 用 做范围检查if(score0score100){...}// ✅ (C# 9)if(scoreis0and100){...}5. 错误处理 {#errors}// ❌ 捕获 Exception 只为记日志并吞掉try{Process();}catch(Exceptionex){logger.LogError(ex,error);}// ✅ — 捕获具体类型无法处理就重新抛出try{Process();}catch(HttpRequestExceptionex){thrownewServiceException(upstream failure,ex);}// ❌ throw ex重置堆栈跟踪catch(Exceptionex){throwex;}// ✅catch(Exceptionex){throw;}// 保留堆栈跟踪// 或包装throw new AppException(context, ex);// ❌ 用异常控制流程try{returndict[key];}catch(KeyNotFoundException){returndefaultValue;}// ✅returndict.TryGetValue(key,outvarvalue)?value:defaultValue;6. 资源管理 {#resources}// ❌ 手动 DisposevarconnnewSqlConnection(cs);conn.Open();// ... 使用 conn ...conn.Dispose();// 异常时遗漏// ✅usingvarconnnewSqlConnection(cs);conn.Open();// 作用域结束时自动释放// ❌ 冗长的 using 块using(varreadernewStreamReader(path)){returnreader.ReadToEnd();}// ✅ (C# 8)usingvarreadernewStreamReader(path);returnreader.ReadToEnd();// 或者直接return File.ReadAllText(path);7. C# 特有的反模式 {#antipatterns}反模式推荐做法string.Format({0}, x)${x}字符串插值公共 API 返回ListTIReadOnlyListT或IEnumerableTasync voidasync Task对 Task 使用.Result/.Wait()awaitthrow exthrow保留堆栈跟踪为数据类型手写IEquatablerecordobject参数带约束的泛型DateTime.NowDateTime.UtcNow或DateTimeOffset可变的公共字段带{ get; set; }或{ get; init; }的属性catch (Exception) { }吞掉一切捕获具体异常未知异常重新抛出没有using的IDisposableusing声明局限性这些是语言特定指南不涵盖整体架构决策。过度压缩可能降低可读性请酌情判断。

相关新闻

本地AI Agent从零部署实战:模型、记忆、工具、编排与远程接入

本地AI Agent从零部署实战:模型、记忆、工具、编排与远程接入

1. 项目概述:这不是“装个软件”,而是一次本地智能体主权的重建 “把 AI Agent 养在自己电脑上”——这句话最近在技术圈刷屏,但很多人点开文章才发现,所谓“养”,不过是下载一个封装好的桌面客户端,背后调…

2026/10/11 5:30:45 阅读更多 →
趣博思 AI|理性看待 AIGC 检测,建立合规的 AI 辅助论文写作习惯

趣博思 AI|理性看待 AIGC 检测,建立合规的 AI 辅助论文写作习惯

随着国内高校陆续将 AIGC 检测纳入论文审查流程,很多学生陷入两种极端心态:一部分人极度恐慌,只要检测出现一点风险标记就焦虑不安;另一部分人抱有侥幸心理,认为只要用工具改写一遍,就可以完全掩盖 AI 生成…

2026/10/11 5:30:45 阅读更多 →
趣博思 AI|分清查重与 AIGC 检测,提前识别论文里隐藏的 AI 文本特征

趣博思 AI|分清查重与 AIGC 检测,提前识别论文里隐藏的 AI 文本特征

在当下论文评审体系中,很多同学容易混淆两项核心自查工具:查重系统和 AIGC 检测。查重比对的是已有文献库的文字重合度,用来识别抄袭;而 AIGC 检测,并不检索外部文献库,而是分析文本本身的语言统计特征&…

2026/10/11 5:30:45 阅读更多 →

最新新闻

Cursor 高级指南(七):CLI 安装、非交互、Worktree 与 ACP 实战配置

Cursor 高级指南(七):CLI 安装、非交互、Worktree 与 ACP 实战配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 7:05:37 阅读更多 →
Unity 笔记二:数字孪生智慧城市中 LookAt 与 Cursor 的协同配置到 TaoToken

Unity 笔记二:数字孪生智慧城市中 LookAt 与 Cursor 的协同配置到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 7:05:37 阅读更多 →
Zion 接入 Gemini 3.5 flash 后,AI Agent Builder 的 BYOM 配置怎么改到 TaoToken

Zion 接入 Gemini 3.5 flash 后,AI Agent Builder 的 BYOM 配置怎么改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 7:05:37 阅读更多 →
2026告别漫长等待:百度网盘冷门资源类似pandownload加速法

2026告别漫长等待:百度网盘冷门资源类似pandownload加速法

很多人在日常保存或者获取资料的时候,经常会遇到文件传输进度停滞不前的情况。面对几十兆甚至几个小容量的文件,进度条却像蜗牛爬行一样缓慢,确实很容易让人感到焦躁和无奈。 其实在很多时候,下载速度提不上来不一定是因为外界的…

2026/10/11 7:05:36 阅读更多 →
OWASP 五大 AI 安全框架:从对话、Agent、技能到协议的全链路防护体系

OWASP 五大 AI 安全框架:从对话、Agent、技能到协议的全链路防护体系

随着生成式AI、自主智能体(Agent)、插件技能生态的大规模落地,AI安全风险早已不再局限于“模型幻觉、提示注入”等基础问题。从模型对话输出、智能体自主决策,到第三方技能插件执行、内外系统协议交互,每一层链路都存在…

2026/10/11 7:05:36 阅读更多 →
安卓分屏自动左滑脚本:Auto.js+ADB实现3秒滑动挂机

安卓分屏自动左滑脚本:Auto.js+ADB实现3秒滑动挂机

先说个真实场景:我手机上装了某短视频极速版,每天要做签到和刷视频任务,手得一遍遍地左滑,滑到拇指发酸。后来我寻思,这滑动动作完全可以用脚本代替。于是就有了标题里这个功能——“循环3秒左滑-支持屏幕上下分屏”。…

2026/10/11 7:04:36 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →