zoukankan      html  css  js  c++  java
  • C#代码风格指南

    参考资料: asp.net 主页仓库

    代码风格 —— 一般原则

    最通用的指导原则是我们使用所有的VS默认设置的代码格式,除了我们把系统命名空间放在其他命名空间之前(这在VS中是默认的,但是在VS的更新版本中已经改变了)。

    1. 使用四个空格缩进(不用Tab)
    2. 私有字段使用_camelCase
    3. 除非必要,避免使用this.
    4. 始终指定成员的可见性,即使你将使用的可见性和默认可见性一致
    5. 开放的大括号({)要另起一行
    6. 你可以使用任何可用的语言特性,但是你要保持代码易读、易于维护
      • 举一个反例:public (int, string) GetData(string filter) => (Data.Status, Data.GetWithFilter(filter ?? throw new ArgumentNullException(nameof(filter))));
      • 这是一条很难读懂的语句

    使用var声明变量

    只要编译器允许,那么尽可能的使用var声明变量,比如下面的代码:

    var fruit = "Lychee";
    var fruits = new List<Fruit>();
    var flavor = fruit.GetFlavor();
    string fruit = null; // can't use "var" because the type isn't known (though you could do (string)null, don't!)
    const string expectedName = "name"; // can't use "var" with const
    

    反面例子:

    string fruit = "Lychee";
    List<Fruit> fruits = new List<Fruit>();
    FruitFlavor flavor = fruit.GetFlavor();
    

    在公共API中只使用完整的单词或通用/标准缩写

    公共名称空间,类型名称,成员名称和参数名称必须使用完整的单词或通用/标准缩写。

    示例:

    public void AddReference(AssemblyReference reference);
    public EcmaScriptObject SomeObject { get; }
    

    反例:

    public void AddRef(AssemblyReference ref);
    public EcmaScriptObject SomeObj { get; }
    

    使用C#类型关键字,而不是.Net Type名

    例如:

    public string TrimString(string s) {
        return string.IsNullOrEmpty(s)
            ? null
            : s.Trim();
    }
    
    var intTypeName = nameof(Int32); // can't use C# type keywords with nameof
    

    反例:

    public String TrimString(String s) {
        return String.IsNullOrEmpty(s)
            ? null
            : s.Trim();
    }
    

    异步方法模式

    默认情况下,所有异步方法都必须具有Async后缀

    扩展方法模式

    一般的规则是:如果一个普通的静态方法就足够了,避免使用扩展方法

    扩展方法通常对创建可链式调用的方法非常有用,例如,在构建复杂对象或创建查询时。

    内部扩展方法是允许的,但要记住先前的指导方针:拍拍胸脯问问自己,扩展方法是否真的是最合适的模式

    扩展方法类的名称空间通常应该是表示扩展方法功能的名称空间,而不是目标类型的名称空间,一个常见的例外是中间件扩展方法的命名空间通常总是与IAppBuilder的命名空间相同。

    扩展方法容器(也称为“sponsor type”)的类名通常应遵循<Feature>Extensions<Target><Feature>Extensions<Feature> <Target>Extensions的模式。例如:

    namespace Food {
        class Fruit { ... }
    }
    
    namespace Fruit.Eating {
        class FruitExtensions { public static void Eat(this Fruit fruit); }
      OR
        class FruitEatingExtensions { public static void Eat(this Fruit fruit); }
      OR
        class EatingFruitExtensions { public static void Eat(this Fruit fruit); }
    }
    

    在编写接口的扩展方法时,sponsor type名称不能以I开头。

    Doc comments

    编写代码的人将写入Doc comments,仅限公共API。非公开类型不需要Doc comments。

    注:public意味着下游可以调用,所以它包含受保护的API。但是,一些公共API可能仍然是“仅供内部使用”,但由于技术原因需要公开。我们仍然会针对这些API提供文档,但是会根据情况进行记录。

    常量定义

    常量的定义使用帕斯卡命名法,避免使用全大写命名
    例如:

    public const string HashKey="ie832js834u9f9wq3h";
    

    错误:

    public const string HASH_KEY="ie832js834u9f9wq3h";
    

    缩写算作单词,避免使用全字符大写

    例如:

    var api ="...
    public void FindApi(...
    

    错误:

    var API ="...
    public void FindAPI(...
    

    例如常见的WTO是缩写,但是建议算作单词,写为 Wto、wto而不是WTO

  • 相关阅读:
    F5 BIG-IP之一前期随笔(应用交付网络产品)
    F5 BIG-IP LTM负载均衡策略
    OA-APP增加空间
    如何在Windows服务器上新建一个Powershell.ps1的定时任务
    领益科技:查询AD中被锁定的账号并进行解锁
    使用Python创建简单的HTTP和FTP服务器
    Mysql binlog日志太多,占用大量磁盘空间该如何正确处理
    【vspher运维】ESXI 日志文件
    【vsphere运维】ESXI命令行操作虚拟机
    内容图片切换
  • 原文地址:https://www.cnblogs.com/rocketRobin/p/9035161.html
Copyright © 2011-2022 走看看