读 《CSharp Coding Guidelines》有感

属性指南

  • 使用 Any() 判断 IEnumerable 是不是为空 ;
  • 仅对低密集型活动使用异步;
  • 对于 CPU密集型使用 Task.Run
  • 防止同时将 async/awaitTask.Wait 混合使用;
  • 避免 async/await 在单线程环境下冒出死锁;

近日在 Github
上看见了1位大牛成立3个储藏室:CSharpCodingGuidelines,打开之后看了弹指间
readme.md 相关描述,感觉应该很不错,于是就 clone
到地点拜读一下,那里列一些融洽的笔记,方便日后回看。

有关链接

其它设计指南

  • 抛出非常而不是回去某体系型的情事值;
  • 提供整体而有意义的百般消息;
  • 抛出适合的最现实的那些;
  • 无须通过 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 关键字;

布局指南

  • 使用正规布局;
  • 基于公式须求开展命名空间的封锁;
  • 将成员置于定义特出的各类中;
  • 小心运用 #region
  • 适量使用表现完美的积极分子;

框架指南

  • 使用 C# 类型 别名而不是系量举办显式调用;
  • 并非硬编码;统命名空间中的类型;
  • 运用最高警戒级别编译代码;
  • 对于简易的表达式防止采取 LINQ
  • 应用 lambda 表明式来代表匿名函数;
  • 只用在运用动态目的时才使用 dynamic 关键字;
  • 支撑异步/等待义务屡次三番;

C# 编程指南

类设计指南

  • 七个类/接口应该唯有3个用场,要符 合单一任务 原则;
  • 只创设重回有用对象的构造函数,当构造函数的参数超越 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,并定义了2个 Print()
方法,接着大家创设2个子类 PocketBook,并通过 new
关键字来重写基类方法。在类型复杂的地方下,使用那种措施将促成大家不可以可相信预测是子类调用依然父类调用,使代码复杂度提高。

  • 有道是可以将派生类当作基类对象来拍卖;
  • 毫不引用基类的派生类;
  • 避免暴光3个目标倚重的别样对象;
  • 防止双向重视;
  • 类应该有情况和行事;
  • 类应该保险其里面景观的一致性;

目录

文档指南

  • 使用美式葡萄牙共和国语来编排相关文档;
  • 文档中的代码部分要力保完整性;
  • 与其余开发人员一起编写 xml 文档;
  • 编写 MSDN 风格的技能文档;
  • 幸免内联注释;
  • 注释值应该用来表明复杂的算法或切磋;
  • 绝不采取注释来跟踪要在事后形成的行事;

可维护性指南

  • 格局内部的代码段尽量不要当先 7 行;
  • 担保全数成员个人,类的类型暗许为为 internal sealed
  • 幸免再度标准;
  • 在其包涵的命名空间内命名程序集;
  • 将源文件命名为它所蕴藏的品种;
  • 将源文件的内容限制为一种档次;
  • 将差其他逻辑函数放到同1个部分类中;
  • 在采取一个门类时,使用 using
    关键字导入须要的命名空间,而不是类其余全部空间标识;
  • 毫无采用魔法数;
  • 只有当类型可想而知时才使用 var 关键字;
  • 概念变量时尽量地伊始化;
  • 在相互独立的代码段中定义目前变量;
  • 若对象有汇集须要起头化的话在开展对象初叶化的还要举行联谊开首化;
  • 并非显式举办 bool 值的比较;
  • 防止嵌套循环;
  • 在使用
    ifelsedowhileforforeachcase
    的还要拔取 {}
  • switch case 代码段中添加 default 逻辑;
  • 在具有的 ifelse if 后再添加 else;
  • 防止使用多少个重临值;
  • 考虑选择简便的规则语句代替 if else
  • 封装属性、方法或一些函数中的复杂表明式;
  • 再适合的意况下品尝重载方法;
  • 利用可选参数来取代重载;
  • 防止选拔命名参数;
  • 防止定义超越一个参数的签约;
  • 幸免函数签名为布尔类型;
  • 不用将参数作为一时变量使用;
  • 将情势作为操作;
  • 不要诠释代码;

命名指南

  • 不要在变量、参数和种类成员中隐含数字;
  • 并非在字段添加前缀;
  • 毫无接纳缩写;
  • 分子、参数和变量定义要依据它们代表的含义;
  • 动用名词、名词短语只怕形容词来定义类型;
  • 应用描述性名称命名泛型参数;
  • 在类成员中永不再一次定义和类相同的名目;
  • 分子定义可参照 .Net Framework 的定义格局;
  • 幸免接纳大概被误解的段名称或字段;
  • 正分明义属性;
  • 在命名格局或部分函数时使用谓词或谓词对象;
  • 接纳名称、层、谓词和功能声明命名空间;
  • 动用动词或动词前缀来定义事件;
  • 使用 ingend 后缀来表明事件预处理和发送事件;
  • 使用 on 前缀来定义事件处理程序;
  • 使用 Async 或者 TaskAsync 来标识异步方法;

性格成员安插指南

  • 同意按专断顺序设置属性;
  • 采纳办法而不是性质;
  • 毫不采取互相排挤的本性;
  • 性情、方法依旧地点方法只应该做一件事情;
  • 无须通过静态成员公开有气象的靶子;
  • 用 IEnumerable 或然 ICollection 来替代具体的聚集对象作为再次来到值;
  • 假设属性、参数和重回值是字符串或许聚众类型的话,则永远不应该为空;
  • 尽量地定义具体的参数;
  • 设想动用特定域的值类型而不是基元;

主干原则

  • Maybachishment
    原则:你的代码应该尽量做到让每一人都能明白。任何人都有写出让机器认识的代码,可是并不是各种人都能写出令人认识的代码;
  • Kiss 原则:类似 Python 之禅 里面说的那么,不难胜于复杂;
  • YAGNI
    原则:代码尽量能不辱职分可伸张,但请不要过于重构,因为您不能预言以后;
  • D君越Y 原则:不要再一次造轮子,除非您有时光恐怕你造的车轱辘会比旁人的佳绩;
  • 面向对象编程原则:继承、封装、多态、抽象;

相关文章