zoukankan      html  css  js  c++  java
  • C# 编码标准(二)

      先八卦一下,昨天写了C# 编码标准(一),得到了@h82258652的补充,感到非常欣慰,一是感觉他的观点扩展了我的视野,丰富了我的看法,所以更坚定了我继续写博客的想法,由于是五笔打字,经常不写东西,有些字的字根都忘记了,所以通过写博客也可以多记些字根,二是决定把多年的一些东西分享出来,一起沟通交流,这样也能够共同进步,共同成长。

    一、编码实践

    1、一个文件的代码避免超过500行。当然这个在特殊情况下也是可以的,只是一个建设吧!

    2、方法要避免超过25行。当然这个在特殊情况下也是可以的,只是一个建设吧!

    3、每行不要超过80个字符。

    4、不要手动编辑任何机器代码。

    5、避免对显而易见的代码作注释,代码应该是自解释的,由可读性强的变量和方法组成的好的代码应该不需要注释。

    6、除了“0”与“1”, 不要用数值硬编码,声明一个常量代替。

    7、仅对本来就是常量的值使用const修饰符,例如一周的天数。

    8、避免对只读的变更使用const,在此情况下,使用readonly修饰符:

    public class MyClass
    {
         public const int DaysInWeek = 7;
         public readonly int Number;
    
         public MyClass(int someValue)
         {
               Number = someValue;
         }                 
    }    

    9、仅捕捉你需要显式处理的异常。

    10、在抛出异常的catch语句中,总是抛出最初异常(或由最初异常构建的另一个异常),以保持最初错误的堆栈位置。

    第一种:
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
        throw;     // 等同于抛出原始异常
    }
    第二种:
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
        throw ex;     // 这样会吃掉异常点,重置堆栈中的异常起始点
    }
    第三种:
    catch
    {
        throw;  // 可捕获所有类型的异常
    }
    第四种:
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
        throw new Exception("经过进一步包装的异常", ex);  // 经过进一步包装的异常,第二个参数保存了原来的异常信息
    }
    推荐使用第一种用法

    11、最小化应用程序的程序集代码(即EXE客户端程序集)。用类库来包含业务逻辑。

    12、避免显式类型转换。使用as操作符防御性地进行转换类型:

    Dog dog = new GermanShepherd();
    GermanShepherd shepherd = dog as GermanShepherd;
    if (shepherd != null)
    {
       ...   
    }

    13、调用委托前始终检查委托是否为空。

    14、不要假定一种类型能支持某个接口。防御性地为接口查询是否支持该接口。

    SomeType obj1;
    IMyInterface obj2;
    
    obj2 = obj1 as IMyInterface;
    if(obj2 != null)
    {
       obj2.Method1();   
    }
    else
    {
        ...
    }

    15、永远不要硬编码将呈现给用户的字符串,而是使用资源。

    16、永远不要硬编码布署时可能修改的字符串,例如连接字符串。

    17、用String.Empty代替"":

    // 避免
    string name = "";
    
    //推荐
    string name = String.Empty;

    18、当频繁地使用一个字符串超过4次,使用StringBuilder,不要使用string。

    19、当提供一个静态成员变量时,总是提供一个静态构造函数。

    20、除非在switch语句中跳转,否则永远不要用goto语句。

    21、不要在使用泛型的代码中对System.Object进行类型转化。使用约束或as运算符:

    class SomeClass
    {}
    // 避免
    class MyClass<T>
    {
       void SomeMethod(T t)
       {
            object temp = t;
            SomeClass obj = (SomeClass)temp;
        }
    }
    
    // 建议
    class MyClass<T> where T : SomeClass
    {
        void SomeMethod(T   t)
        {
            SomeClass obj = t;
        }
    }

    22、不要在泛型接口中定义约束条件。接口级别的约束常常可以用强类型代替:

    public class Customer
    {...}
    
    // 避免
    public interface IList<T> where T : Customer
    {...}
    // 建议
    public interface ICustomerList : IList<Customer>

    23、lock锁私有只读静态对象。不要使用lock (this)lock (typeof (MyType))lock ("myLock")等

  • 相关阅读:
    sublime 设置侧边栏颜色
    laravel 连接mongodb
    PHP empty(),isset()与is_null()的实例测试
    ubuntu 14.04 64位安装 深度截图
    ubuntu 14.04 64位安装 lightworks (解决libtiff4依赖)
    ubuntu LAMP 配置
    一个查询大学英语四六级的类
    jstree 权限树 简单教程
    对接ebay,订单系统开发
    常用的PHP判断 检测 函数.
  • 原文地址:https://www.cnblogs.com/cang/p/4214073.html
Copyright © 2011-2022 走看看