读 《CSharp Coding Guidelines》有感

C# 编程指南

前不久在 Github 上看见了一位大牛创建一个仓库:CSharpCodingGuidelines,打开之后看了一下 readme.md 相关描述,感觉应该很不错,于是就 clone 到本地拜读一下,这里列一些自己的笔记,方便日后回顾。

基本原则

  • Astonishment 原则:你的代码应该尽量做到让每一个人都能理解。任何人都有写出让机器认识的代码,但是并不是每个人都能写出让人认识的代码;

  • Kiss 原则:类似 Python 之禅 里面说的那样,简单胜于复杂;

  • YAGNI 原则:代码尽量能做到可扩展,但请不要过度重构,因为你不能预知未来;

  • DRY 原则:不要重复造轮子,除非你有时间或者你造的轮子会比别人的优秀;

  • 面向对象编程原则:继承、封装、多态、抽象;

类设计指南

  • 一个类/接口应该只有一个用途,要符 合单一职责 原则;

  • 只创建返回有用对象的构造函数,当构造函数的参数超过 3 的话,你就应该考虑你的类设计是否过于臃肿;

  • 接口应该短小精悍,其定义要明确清晰地传达出其具有的行为;

  • 如果一种行为有多种实现,请考虑使用接口而不是基类;

  • 尽量使用接口将类进行彼此解耦;

  • 避免使用静态类;

  • 不要使用 new 关键字来禁止编译器显示相关警告;

640?wx_fmt=png

在上述代码段中,我们创建一个基类 book,并定义了一个 Print() 方法,接着我们创建一个子类 PocketBook,并通过 new 关键字来重写基类方法。在项目复杂的情况下,使用这种方式将导致我们不能准确预测是子类调用还是父类调用,使代码复杂度提升。

  • 应该可以将派生类当作基类对象来处理;

  • 不要引用基类的派生类;

  • 避免暴露一个对象依赖的其它对象;

  • 避免双向依赖;

  • 类应该有状态和行为;

  • 类应该保护其内部状态的一致性;

属性成员设计指南

  • 允许按任意顺序设置属性;

  • 使用方法而不是属性;

  • 不要使用相互排斥的属性;

  • 属性、方法或者本地方法只应该做一件事情;

  • 不要通过静态成员公开有状态的对象;

  • 用 IEnumerable

     或者 ICollection 来代替具体的集合对象作为返回值;
  • 如果属性、参数和返回值是字符串或者集合类型的话,则永远不应该为空;

  • 尽可能地定义具体的参数;

  • 考虑使用特定域的值类型而不是基元;

其他设计指南

  • 抛出异常而不是返回某种类型的状态值;

  • 提供完整而有意义的异常信息;

  • 抛出适当的最具体的异常;

  • 不要通过 try - catch 方式隐藏异常;

  • 正确处理异步代码中的异常;

  • 调用事件委托前先判断是否为空;

event EventHandler<string> Notify;
protected virtual void OnNotify(string args){Notify?.Invoke(this, args); }
  • 使用受保护的虚方法来触发每个事件;

  • 考虑添加属性变化事件;

  • 当触发事件时要确保 sender != nulll;

  • 如果合适的话,请考虑使用泛型约束;

640?wx_fmt=png

  • 在返回 LINQ 表达式之前计算它的结果;

  • 如果不是必须,不要使用 this 和 base 关键字;

可维护性指南

  • 方法内部的代码段尽量不要超过 7 行;

  • 确保所有成员私有,类的类型默认为为 internal sealed

  • 避免双重条件;

  • 在其包含的命名空间内命名程序集;

  • 将源文件命名为它所包含的类型;

  • 将源文件的内容限制为一种类型;

  • 将不同的逻辑函数放到同一个部分类中;

  • 在使用一个类型时,使用 using 关键字导入需要的命名空间,而不是类型的完整空间标识;

  • 不要使用魔法数;

  • 只有当类型显而易见时才使用 var 关键字;

  • 定义变量时尽可能地初始化;

  • 在相互独立的代码段中定义临时变量;

  • 若对象有集合需要初始化的话在进行对象初始化的同时进行集合初始化;

  • 不要显式进行 bool 值的比较;

  • 避免嵌套循环;

  • 在使用 ifelsedowhileforforeachcase 的同时使用 {} ;

  • 在 switch case 代码段中添加 default 逻辑;

  • 在所有的 if 、else if 后再添加 else;

  • 避免使用多个返回值;

  • 考虑使用简单的条件语句代替 if else

  • 封装属性、方法或局部函数中的复杂表达式;

  • 再合适的情况下尝试重载方法;

  • 使用可选参数来代替重载;

  • 避免使用命名参数;

  • 避免定义超过3个参数的签名;

  • 避免函数签名为布尔类型;

  • 不要将参数作为临时变量使用;

  • 将模式作为操作;

  • 不要注释代码;

命名指南

  • 不要在变量、参数和类型成员中包含数字;

  • 不要在字段添加前缀;

  • 不要使用缩写;

  • 成员、参数和变量定义要根据它们代表的意义;

  • 使用名词、名词短语或者形容词来定义类型;

  • 使用描述性名称命名泛型参数;

  • 在类成员中不要重复定义和类相同的名称;

  • 成员定义可参考 .Net Framework 的定义方式;

  • 避免使用可能被误解的段名称或字段;

  • 正确定义属性;

  • 在命名方法或局部函数时使用谓词或谓词对象;

  • 使用名称、层、谓词和功能申明命名空间;

  • 使用动词或动词前缀来定义事件;

  • 使用 ing 和 end 后缀来表达事件预处理和发送事件;

  • 使用 on 前缀来定义事件处理程序;

  • 使用 Async 或者 TaskAsync 来标识异步方法;

性能指南

  • 使用 Any() 判断 IEnumerable 是否为空 ;

  • 仅对低密集型活动使用异步;

  • 对于 CPU密集型使用 Task.Run

  • 避免同时将 async/await 和 Task.Wait 混合使用;

  • 避免 async/await 在单线程环境下出现死锁;

框架指南

  • 使用 C# 类型 别名而不是系量进行显式调用;

  • 不要硬编码;统命名空间中的类型;

  • 使用最高警告级别编译代码;

  • 对于简单的表达式避免使用 LINQ

  • 使用 lambda 表达式来代替匿名函数;

  • 只用在使用动态对象时才使用 dynamic 关键字;

  • 支持异步/等待任务延续;

文档指南

  • 使用美式英语来编写相关文档;

  • 文档中的代码部分要保证完整性;

  • 与其他开发人员一起编写 xml 文档;

  • 编写 MSDN 风格的技术文档;

  • 避免内联注释;

  • 注释值应该用来解释复杂的算法或讨论;

  • 不要使用注释来跟踪要在以后完成的工作;

布局指南

  • 使用常规布局;

  • 根据公式要求进行命名空间的约束;

  • 将成员置于定义良好的顺序中;

  • 谨慎使用 #region

  • 适当使用表现健全的成员;

相关链接

  • Code Complete: A Praccal Handbook of Soware Construcon (Steve McConnel)

  • The Art of Agile Development (James Shore)

  • Applying Domain-Driven Design and Paerns: With Examples in C# and .NET (Jimmy Nilsson)

  • Jeremy D. Miller's Blog

  • LINQ Framework Design Guidelines

  • Best Pracces for c# async/await

原文地址:https://www.cnblogs.com/hippieZhou/p/9410623.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客网 【每日一题】4月10日 二分图染色(弱化版)

精讲 组合、容斥 文章目录题目&#xff1a;题意&&题解&#xff1a;&#xff1a;代码&#xff1a;题目传送题目&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld …

微软Windows Community Toolkit一览

为了满足业务线开发人员的需求&#xff0c;微软推出了Windows Community Toolkit。这个快速变化的库充当了新的UWP控件和功能的测试基础。在创建UWP之初&#xff0c;其重点目标是智能手机和平板电脑。这意味着大部分开发预算都花费在控件上&#xff0c;确保这些控件能够在有限的…

如何简单的在 ASP.NET Core 中集成 JWT 认证?

前情提要&#xff1a;ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统文章超长预警&#xff08;1万字以上&#xff09;&#xff0c;不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包自上一篇介绍如何在 ASP.NET Core 中集成 JWT 的博文发布…

【二分】【暴力】蛋糕(gmoj 3918)

蛋糕 gmoj 3918 题目大意&#xff1a; 有一个蛋糕&#xff0c;分成n∗mn*mn∗m个单位&#xff0c;现在横竖各切三刀&#xff0c;使其分成16个矩阵&#xff0c;使价值最小的矩阵价值最大 输出样例 5 5 95998 21945 23451 99798 74083输入样例 3数据范围 40%的数据&#x…

Music Problem

文章目录题目描述题意&#xff1a;题解&#xff1a;传送时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld 题目描述 Listening to the music is relax, but for obsessive(强迫症), it …

可扩展架构设计的三个维度

业界对于可扩展的系统架构设计有一个朴素的理念,就是&#xff1a;通过加机器就可以解决容量和可用性问题这一理念在“云计算”概念疯狂流行的今天&#xff0c;得到了广泛的认可&#xff01;对于一个规模迅速增长的系统而言&#xff0c;容量和性能问题当然是首当其冲的。但是随着…

.NET Core开发日志——简述路由

有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生。如果要用一句话解释什么是路由&#xff0c;可以这样形容&#xff1a;通过对URL的解析&#xff0c;指定相应的处理程序。回忆下在Web Forms应用程序中使用路由的方式&#xff1a;然后是MVC应用程序&…

博客开通

开通博客第一天&#xff0c;纪念一下——

.NetCore Cap 结合 RabbitMQ 实现消息订阅

开源分布式消息框架 Cap 可以在GitHub上拉也可以通过nuget添加上一篇博文写了 Windows RabbitMQ的安装使用 Cap支持事务&#xff0c;通过捕获数据库上下文连接对象实现 消息事务&#xff0c;消息持久化怎么来实现消息订阅 消费&#xff1f;使用起来非常简单&#xff0c;主要通过…

小H和游戏

文章目录题目描述题解&#xff1a;传送时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 小H正在玩一个战略类游戏&#xff0c;她可以操纵己方的飞机对敌国的N座城市(编号为1~N…

asp.net core 发布到 docker 容器时文件体积过大及服务端口的配置疑问

在 asp.net core 发布时&#xff0c;本人先后产生了3个疑问。1、发布的程序为什么不能在docker容器中运行当时在window开发环境中发布后&#xff0c;dotnet xxx.dll可以正常运行&#xff1b;但放入docker容器后就报 *.*.deps.json not found 的错误。后根据下面的文章解决了问题…

水题(water)(非详细解答)

传送 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 其中&#xff0c;f(1)1;f(2)1;Z皇后的方案数&#xff1a;即在ZZ的棋盘上放置Z个皇后&#xff0c;使其互不攻击的方案数。…

网络流小结

最大流&#xff1a; EK算法&#xff1a; #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; const int inf0x7fffffff; const int maxn10010; struct node{int u,v,f,next; }edge[300050]; int s,t,cnt,…

.NET MVC CSRF/XSRF 漏洞

最近我跟一个漏洞还有一群阿三干起来了……背景&#xff1a;我的客户是一个世界知名的药企&#xff0c;最近这个客户上台了一位阿三管理者&#xff0c;这个货上线第一个事儿就是要把现有的软件供应商重新洗牌一遍。由于我们的客户关系维护的非常好&#xff0c;直接对口人提前透…

jzoj5057-[GDSOI2017模拟4.13]炮塔【网络流,最大权闭合图】

正题 题面链接:https://gmoj.net/senior/#main/show/5057 题目大意 n∗mn*mn∗m的网格上有一些炮和敌军&#xff0c;每个炮可以攻击在它方向上一个敌军&#xff0c;但是要求炮弹的轨迹不能交叉。求最多打死多少敌军。 解题思路 我们先把炮分成两类&#xff0c;一类是横着打&a…

讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

正文ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性&#xff0c;今天主角就是 ApiControllerAttribute。0. ApiControllerAttribute 继承自 ControllerAttributeASP.NET Core MVC 已经有了ControllerAttribute&#xff0c;这个用来标注一个类型是否是Controller。…

新的UWP和Win32应用程序分发模型

自2005年引入ClickOnce技术以来&#xff0c;.NET就支持应用程序自动升级。在ClickOnce模型中&#xff0c;WinForms和WPF应用程序在启动时会从预先配置好的位置查找新版本。但是&#xff0c;由于微软试图模仿iOS应用商店模型&#xff0c;所以&#xff0c;该模型未能延续到UWP。微…

.net core grpc 实现通信(一)

现在系统都服务化&#xff0c;.net core 实现服务化的方式有很多&#xff0c;我们通过grpc实现客户端、服务端通信。grpc(https://grpc.io/)是google发布的一个开源、高性能、通用RPC&#xff08;Remote Procedure Call&#xff09;框架&#xff0c;使用HTTP/2协议&#xff0c;…

子序列

牛客网题目 题目描述 给出一个长度为n的序列&#xff0c;你需要计算出所有长度为k的子序列中&#xff0c;除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T&#xff0c;表示数据组数。 对于每组数据&#xff0c;第一行两个整数N&#xff0c;k&#xff0c;含义…

横向扩展你的ASP.NET Core SignalR 应用

前言最近项目要用signalr来做实时通信&#xff0c;在研究asp.netcore signalr 应用横向扩展时候发现了这篇国外的博客&#xff0c;和大家分享一下原文连接地址负载均衡当你把你的应用部署到生产环境时&#xff0c;你将会想横向扩展你的应用。横向扩展意味着要你的应用要在多台服…