C# 编程指南

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

基本原则

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

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

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

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

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

类设计指南

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

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

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

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

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

  • 避免使用静态类;

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

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

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

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

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

  • 避免双向依赖;

  • 类应该有状态和行为;

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

属性成员设计指南

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

  • 使用方法而不是属性;

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

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

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

  • 用 IEnumerable

    或者 ICollection 来代替具体的集合对象作为返回值;

  • 如果属性、参数和返回值是字符串或者集合类型的话,则永远不应该为空;

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

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

其他设计指南

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

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

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

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

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

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

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

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

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

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

  • 在返回 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 

读 《CSharp Coding Guidelines》有感相关推荐

  1. 读《大道至简-- 第二章 是懒人造就了方法》 有感

    社会的进步.科学的发展,无不是靠这些"懒人". 懒人造就了方法,这句话一点也没错.突然间想想那些聪明的人,大多都是懒人.因为想得多,所以做得少.因为想得多,所以思维得到了锻炼,变得 ...

  2. 《大道至简》第二章——是懒人造就了方法 (读后感)

    何为"大道至简"?在周爱民的<大道至简>一书中给出的大道至简的解析是软件工程实践者的思想,它是一种思想,而不是一些招数或者方法. 前几天我把这本书的第一章用伪代码的形式 ...

  3. 大道至简(读后感)第二章 是懒人造就了方法

    <华阳国志>中写道 " 僰道有蜀王兵蘭 ,亦有神作大滩江中.其崖崭峻不可破,(冰)乃积薪烧之." 史记中记载战国时李冰凿了一座山搞成一条河.他的伟绩也是够大的! < ...

  4. 读大道至简第二章感悟

    愚公很勤快,他每天都很努力的"叩石垦壤",不停的"箕畚运于渤海尾".年复一年,日复一日,无止无休.只是为"毕力平险,指通豫南,达于阴".但是 ...

  5. 读《大道至简—是懒人造就了方法 》有感

    读了大道至简第一章编程的精义之后,我觉得感触颇深,于是乎我又读了第二章是懒人造就了方法 ,之后果然没有让我失望,第二章写的也是非常的好,非常的吸引我. 第二章的开头便引用了李冰凿山的故事,在战国时代, ...

  6. 《大道至简》第二章读后感--是懒人造就了方法

    何为"大道至简"?在周爱民的<大道至简>一书中给出的大道至简的解析是软件工程实践者的思想,它是一种思想,而不是一些招数或者方法. "僰蘭道有蜀王兵,亦有神作大 ...

  7. 大道至简 第二章 读后随笔

    第二章的题目为"是懒人造就了方法",我就纳闷了懒人这么懒怎么会创造东西呢?而作者引用的李冰放火烧山以开凿的历史故事,让我顿时茅塞顿开.我继而联想到从古代的脚力.马车到如今的汽车.飞 ...

  8. 《大道至简 第二章》读后感

    是懒人造就了方法 --------读<大道至简>第二章有感 为什么<列子·汤问篇>里的愚公移山就要"碎石击壤",而李冰凿山就已经懂得"积薪烧之&q ...

  9. 《大 道 至 简   ——软件工程实践者的思想 》是懒人造就了方法读后感

    大道至简:软件工程实践者的思想 --是懒人造就了方法读后感 俗话说懒人造就了方法,在很久以前的战国的有这么一个故事 "蜀守冰凿离堆",据说是说李冰(约公元前302年~235年,生卒 ...

  10. 《大道至简第二章读后感》

    在阅读了大道至简的第一章后,我又紧接着阅读了第二章.第二章的名字很有趣,叫做"是懒人创造了方法".和第一章一样,第二章开始便引用了一篇古文.是<华阳国志>里的一部分,讲 ...

最新文章

  1. 服务器修改网卡,美国服务器CentOS 6.x修改网卡名称的方法
  2. 在PPT中通过插入重叠的图形获得新的图形
  3. windows下安装服务注册Consul
  4. 另一种方法做本地reuse library的开发
  5. 作者:陈纯(1955-),男,博士,浙江大学计算机科学与技术学院教授,中国工程院院士。...
  6. 无代码时代来临,程序员如何保住饭碗?赶紧看一看!
  7. 33. 把数组排成最小的数(C++版本)
  8. jq select 修改选中_转 jquery操作select(取值,设置选中)
  9. QQ桌球瞄准器的球心计算算法
  10. 在html中用于设置页面元信息的标示符,在html中用于设置页面元信息的标示符是什么...
  11. 浪涌电流和浪涌电压解析
  12. 二叉树的遍历(递归算法与非递归算法)
  13. Linux man 命令后面的数字含义及作用
  14. 使用nginx上传大文件报500异常处理
  15. 【动手撸深度学习】细粒辨花 一文实践清华博士Densenet
  16. 《用户画像--方法论与工程化解决方法》读后感
  17. RHCE(tuend,stratis,vdo)
  18. 用C语言写的一个顺序表实现图书馆书籍管理
  19. sleep(0),sleep以及yeid 的区别
  20. 操作系统原理_田丽华

热门文章

  1. iPhone比小米贵3000,贵在哪里?
  2. ubuntu下mysql-python模块的安装
  3. 简单而不简陋﹣wp7视觉点滴
  4. 使用这个库,让你的服务操作 Redis 速度飞起
  5. 面向.NET开发人员的Dapr——状态管理
  6. Dotnet洋葱架构实践
  7. EFCore查缺补漏(一):依赖注入
  8. 快来参加学习.NET 挑战赛
  9. 芯片项目谁支持谁负责 重大损失将予以通报
  10. 如何校验内存数据的一致性,DynamicExpresso 算是帮上大忙了