改善C#程序的157个建议-基本语言要素

    • 1、字符串
      • string 是关键字,Systme.String是一个类。
      • 使用 Empty 常量值初始化字符串,以新建字符串长度为零的 String 对象。 长度为零的字符串文本表示法是“”。 通过使用 Empty 值(而不是 null)初始化字符串,可以减少 NullReferenceException 发生的可能性。 尝试访问字符串前,先使用静态 IsNullOrEmpty(String) 方法验证字符串的值。
      • 字符串对象是“不可变的”:它们在创建后无法更改。 看起来是在修改字符串的所有 String 方法和 C# 运算符实际上都是在新的字符串对象中返回结果。 在下面的示例中,当 s1 和 s2 的内容被串联在一起以形成单个字符串时,两个原始字符串没有被修改。 += 运算符创建一个新的字符串,其中包含组合的内容。 这个新对象被分配给变量 s1,而分配给 s1 的原始对象被释放,以供垃圾回收,因为没有任何其他变量包含对它的引用。
      • 格式字符串:
        • 内插字符串由 $ 特殊字符标识,并在大括号中包含内插表达式
        • String.Format 利用大括号中的占位符创建格式字符串,内部使用StgingBuilder
      • 使用 StringBuilder 快速创建字符串
    • 3、区别对待强制转型和as与is
      • 如果类型之间都上溯到了某个共同的基类,那么根据此基类进行的转型(即基类转型为子类本身)应该使用as。子类与子类之间的转型,则应提转换操作符,以便进行强制转型。
      • as只能用于引用类型,不能用于值类型。强制转换可以用于任何类型。
      • as转换失败不会抛异常,强制转换会抛异常。
    • 4、TryParse比Parse好
      • TryParse比Parse效率高很多,不是一个数量级。
    • 5、使用int?确保值类型也可以是null
    • 6、区别readonly和const
      • const是一个编译器常量(天然就是static,无需再加static修饰符),readonly是一个运行时常量
      • const只能修饰基元类型、枚举和字符串,readonly没有限制。
      • const是属于类级别而不是实例对象级别,不能跟static一起使用。而readonly既可以是类级别也可以是实例级别,可以与static一起使用。
    • 7、将0作为枚举类型的默认值
      • 尽量不显示的为每个枚举值赋值
    • 9、习惯运算符重载
      • 在CLR支持的类型中,使用operator关键字创建静态成员函数实现运算符重载。
    • 10、创建对象时需要考虑是否实现比较器
    • 11、区别对待==和Equals
      • 所谓相等,对于值类型表示值相等,对于引用类型,表示引用同一个对象。
      • 一把来说,对于引用类型,我们要定义“值相等性”,我们应该仅仅重载Equals方法,同时用==表示“引用相等性”。
      • FCL中提供了Object.ReferenceEquals方法,该方法比较的是,两个实例是否是同一个实例。
    • 12、重写Equals时也要重写GetHashCode
      • 如果重写Equals方法的时候不重写GetHashCode方法,在使用Dcitionary类时,会隐含一些潜在的bug。
    • 13、为类型输出格式化字符串
      • 一种是让类型继承接口IFormattable,重写ToString方法,如果没有为类型重写该方法,会调用Object的ToString方法,它返回类型的名称。
      • 一种是为类型自定义格式化器,可以根据需求的变化为类型提供多个格式化器。一个典型的格式化器应该继承接口IFormatProvider和ICustomFormatter
    • 14、正确实现浅拷贝和深拷贝
      • 无论深拷贝还是浅拷贝,微软都建议实现ICloneable接口明确告诉调用者该类型可以被拷贝。
      • 浅拷贝的实现:return this.MemnerwiseClone();
      • 深拷贝实现有两种:
        • 逐个字段赋值拷贝,但是这种方法容易出错,不易维护
        • 建议使用序列化深拷贝
    • 15、使用dynamic简化反射的实现
      • 始终使用dynamic来简化反射的实现
    •  
posted @ 2021-09-26 15:24  ChristalXue  阅读(105)  评论(1)    收藏  举报