当前位置:3016.com-金沙城中心官网 > 编程 > 读 《CSharp Coding Guidelines》有感

读 《CSharp Coding Guidelines》有感

文章作者:编程 上传时间:2019-10-13

目录

  • 大旨尺度
  • 类设计指南
  • 天性成员安顿指南
  • 其余安插指南
  • 可维护性指南
  • 取名指南
  • 天性指南
  • 框架指南
  • 文书档案指南
  • 布局指南
  • 相关链接

C# 编制程序指南

多年来在 Github 上见到了一人民代表大会腕创制三个储藏室:CSharpCodingGuidelines,展开之后看了一晃 readme.md 相关描述,感到应该很准确,于是就 clone 到当地拜读一下,这里列一些融洽的笔记,方便日后回顾。

着力规范

  • Astonishment 原则:你的代码应该尽或然做到让每壹位都能明白。任何人都有写出让机器认知的代码,可是实际不是各样人都能写出令人认识的代码;
  • Kiss 原则:类似 Python 之禅 里面说的那样,轻松胜于复杂;
  • YAGNI 原则:代码尽量能落成可增添,但请不要过度重构,因为您无法预言今后;
  • DWranglerY 原则:不要再度造轮子,除非您有的时候光还是您造的轮子会比别人的美好;
  • 面向对象编制程序原则:承继、封装、多态、抽象;

类设计指南

  • 多少个类/接口应该唯有贰个用场,要符 合单一任务 原则;
  • 只创制再次来到有用对象的构造函数,当构造函数的参数超越 3 的话,你就相应思量你的类设计是或不是过分臃肿;
  • 接口应该短小精悍,其定义要明了清晰地传达出其持有的一举一动;
  • 假诺一种行为有各个兑现,请怀想选择接口实际不是基类;
  • 尽恐怕采纳接口将类实行互动解耦;
  • 防止采纳静态类;
  • 决不选择 new 关键字来禁绝编写翻译器显示相关警报;
public class Book
{
    public virtual void Print()
    {
        Console.WriteLine("Printing Book");
    }
}

public class PocketBook : Book
{
    public new void Print()
    {
        Console.WriteLine("Printing PocketBook");
    }
}

class Program
{
    static void Main(string[] args)
    {
        PocketBook pocketBook = new PocketBook();
        pocketBook.Print();

        ((Book)pocketBook).Print();

        Console.ReadKey();
    }
}

在上述代码段中,我们创造二个基类 book,并定义了一个 Print() 方法,接着大家创制一个子类 PocketBook,并通过 new 关键字来重写基类方法。在类型复杂的情状下,使用这种措施将招致我们不能够精确预测是子类调用照旧父类调用,使代码复杂度提升。

  • 应该能够将派生类当做基类对象来管理;
  • 毫无引用基类的派生类;
  • 防止暴光二个目的重视的别样对象;
  • 制止双向重视;
  • 类应该有动静和作为;
  • 类应该维护其内部景色的一致性;

个性成员安排指南

  • 允许按专擅顺序设置属性;
  • 接纳方式并非性质;
  • 不要选用相互排挤的性质;
  • 属性、方法也许地方方法只应该做一件事情;
  • 不用通过静态成员公开有动静的靶子;
  • 用 IEnumerable 可能 ICollection 来取代具体的联谊对象作为重临值;
  • 借使属性、参数和再次来到值是字符串恐怕聚众类型的话,则长久不应有为空;
  • 用尽全力地定义具体的参数;
  • 设想采用特定域的值类型实际不是基元;

任何布署指南

  • 抛出特别并不是回到某连串型的境况值;
  • 提供全体而有意义的格外音讯;
  • 抛出特别的最实际的老大;
  • 永不通过 try - catch 形式遮蔽十分;
  • 准确管理异步代码中的非凡;
  • 调用事件委托前先剖断是还是不是为空;
event EventHandler<string> Notify;
protected virtual void OnNotify(string args)
{
    Notify?.Invoke(this, args);
}
  • 运用受保证的虚方法来触发种种事件;
  • 设想增多属性别变化化事件;
  • 当接触事件时要保管 sender != nulll;
  • 如果正好的话,请思索接纳泛型约束;
class SomeClass
{
}

/// <summary>
/// 不推荐
/// </summary>
class MyClass1
{
    void SomeMethod<T>(T t)
    {
        object temp = t;
        SomeClass obj = (SomeClass)temp;
    }
}

/// <summary>
/// 推荐
/// </summary>
class MyClass2
{
    void SomeMethod<T>(T t) where T :SomeClass
    {
        SomeClass obj = t;
    }
}
  • 在重回 LINQ 表明式以前总括它的结果;
  • 假使不是必需,不要采用 thisbase 关键字;

可维护性指南

  • 主意内部的代码段尽量不要超过 7 行;
  • 保障全体成员个人,类的类型默以为为 internal sealed
  • 防止重新标准;
  • 在其蕴藉的命名空间内命名程序集;
  • 将源文件命名叫它所满含的品类;
  • 将源文件的内容限制为一种档案的次序;
  • 将不一致的逻辑函数放到同一个局部类中;
  • 在行使多少个项目时,使用 using 关键字导入供给的命名空间,并非项目标完全空间标记;
  • 无须接纳法力数;
  • 除非当类型可想而知时才使用 var 关键字;
  • 概念变量时尽量地最早化;
  • 在交互独立的代码段中定义偶尔变量;
  • 若对象有集聚须要伊始化的话在展开对象起头化的还要扩充联谊初叶化;
  • 绝不显式实行 bool 值的可比;
  • 幸免嵌套循环;
  • 在使用 ifelsedowhileforforeachcase 的还要采用 {}
  • switch case 代码段中增多 default 逻辑;
  • 在有着的 ifelse if 后再增多 else;
  • 幸免使用两个重返值;
  • 设想动用简便的口径语句代替 if else
  • 封装属性、方法或一些函数中的复杂表达式;
  • 再贴切的气象下品尝重载方法;
  • 利用可选参数来代表重载;
  • 制止使用命名参数;
  • 幸免定义超越3个参数的签字;
  • 幸免函数具名称为布尔类型;
  • 毫无将参数作为临时变量使用;
  • 将格局作为操作;
  • 不要批注代码;

命名指南

  • 毫无在变量、参数和花色成员中隐含数字;
  • 永不在字段增加前缀;
  • 不用使用缩写;
  • 分子、参数和变量定义要依照它们代表的意义;
  • 动用名词、名词短语也许形容词来定义类型;
  • 应用描述性名称命名泛型参数;
  • 在类成员中不用再一次定义和类同样的名号;
  • 分子定义可参考 .Net Framework 的概念方式;
  • 制止选用或然被误会的段名称或字段;
  • 准确定义属性;
  • 在命名格局或部分函数时利用谓词或谓词对象;
  • 应用名称、层、谓词和作用注明命名空间;
  • 运用动词或动词前缀来定义事件;
  • 使用 ingend 后缀来表达事件预管理和发送事件;
  • 使用 on 前缀来定义事件管理程序;
  • 使用 Async 或者 TaskAsync 来标记异步方法;

脾气指南

  • 使用 Any() 判断 IEnumerable 是或不是为空 ;
  • 仅对低密集型活动选取异步;
  • 对此 CPU密集型使用 Task.Run
  • 幸免同期将 async/awaitTask.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

本文由3016.com-金沙城中心官网发布于编程,转载请注明出处:读 《CSharp Coding Guidelines》有感

关键词: