提高代码质量
子菲渔
子非鱼安知鱼之乐
展开
-
Tip6 区别readonly和const的使用方法
Tip6 区别readonly和const的使用方法 const效率更高,readonly灵活性更强。区别: 1、const是一个编译期常量,readonly是一个运行时常量。 2、const只能修饰基元类型、美剧类型或字符创类型,readonly没有限制。const效率高是因为经过编译器编译后,引用const变绿的地方会用const变量所对应的实际值来代替,如:const in...原创 2017-07-31 16:55:47 · 756 阅读 · 0 评论 -
Tip15 使用dynamic来简化反射实现
Tip15 使用dynamic来简化反射实现 dynamic是Framework 4.0的新特性。dynamic的出现让C#具有了弱语言的特性,编译器默认dynamic对象支持开发者想要的任何特性。 var和dynamic完全是两个概念。var实际上是“语法糖”,编译器会自动匹配var变量的实际类型,并用实际类型来替换该变量的声明。而dynamic被编译后实际是一个object类原创 2017-08-03 14:52:54 · 269 阅读 · 0 评论 -
Tip14 正确实现浅拷贝和深拷贝
Tip14 正确实现浅拷贝和深拷贝 浅拷贝:将对象中的所有字段复制到新的对象(副本)中。复制以后,若在副本中修改值类型的字段的值,不会影响到源对象对应的值,但修改引用类型的字段的值,会影响到源对象本身。 深拷贝:将对象中的所有字段复制到新的对象(副本)中。但是复制以后,对于副本的修改都不会影响到源对象本身。拷贝建议用类型继承ICloneable接口。例如: [Serializable]原创 2017-08-02 20:38:54 · 409 阅读 · 0 评论 -
Tip13 为类型输出格式化字符串
Tip13 为类型输出格式化字符串 有两种方法为类型提供格式化的字符串输出: 1、让类型继承接口IFormattable。(需要预见类型在格式化方面的需求) 2、让类型继承接口IFormatProvider和ICustomFormatter,为类型自定义格式化器。方法1的例子: class Person : IFormattable { public string原创 2017-08-02 20:02:27 · 367 阅读 · 0 评论 -
Tip12 重写Equals时也要重写GetHashCode
Tip12 重写Equals时也要重写GetHashCode 如果重写Equals方法但不重写GetHashCode方法,在使用如FCL中的Dictionary类时,可能隐含一些潜在的Bug。例如: class Person { public string IDCode { get; private set; } publ原创 2017-08-02 12:00:14 · 278 阅读 · 0 评论 -
Tip11 区别对待==和Equals
Tip11 区别对待==和Equals “相等性”分为两类: 1、“值相等性”——比较的两个变量所包含的数值相等。 2、“引用相等性”——比较的两个变量引用的是内存中的同一个对象。“==”和“Equals”都倾向于表达这样一个原则: 对于值类型,如果类型的值相等,就应该返回True。 对于引用类型,如果类型只想同一个对象,则返回True。“==”和“Equals”都可以被重载。比如,str原创 2017-08-02 09:38:40 · 331 阅读 · 0 评论 -
Tip10 创建对象时需要考虑是否实现比较器
Tip10 创建对象时需要考虑是否实现比较器 有对象的地方就会存在比较,在创建对象的时候需要考虑是否实现比较器(实现接口IComparable和IComparer) 下面举个例子,根据排序的需要,列表要支持针对基本工资或奖金来罗列Salary: static void Main(string[] args) { List<Salary> companySalary原创 2017-08-02 09:00:41 · 222 阅读 · 0 评论 -
Tip9 习惯重载运算符
Tip9 习惯重载运算符 在构建自己的类型时,应该考虑该类型是否可以用于运算符重载,使代码看起来跟简洁明了。例如: class Program { static void Main(string[] args) { Salary mikeIncome = new Salary() { RMB = 22 };原创 2017-08-01 21:38:30 · 357 阅读 · 0 评论 -
Tip8 避免给枚举类型的元素提供显示的值
Tip8 避免给枚举类型的元素提供显示的值 一般情况下,没有必要给枚举类型的元素提供显式的值,因为不正确地设定显式的值会带来意想不到的错误。例如: enum Week { Monday = 1, Tuesday = 2, ValueTemp, Wednesday = 3, Thursday = 4原创 2017-08-01 21:27:50 · 282 阅读 · 0 评论 -
Tip7 将0值作为枚举的默认值
Tip7 将0值作为枚举的默认值 允许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long、和ulong。应该始终将0值作为枚举类型的默认值,这样做是有工程上的意义。例如: 一个代表星期的枚举类Week,我们会想当然认为应该有7个元素,但是我们没有让它从0开始enum Week{ Monday = 1, Tuesday =原创 2017-07-31 17:37:51 · 262 阅读 · 0 评论 -
Tip1 正确操作字符串
前言 最近在看一本书——《编写高质量代码,改善C#程序的157个建议》,非常好的一本书,在此写一些自己的简单总结。下面提供了下载链接: 电子书和源码下载 Tip1 正确操作字符串 应当尽可能避免不必要的装箱,避免分配额外的内存空间。例如:string s1 = "abc";s1 = "123" + s1 + "456"; //以上两行代码创建了3个//字...原创 2017-07-29 14:59:51 · 333 阅读 · 0 评论 -
Tip5 使用Int?来确保值类型也可用为null
Tip5 使用Int?来确保值类型也可用为null 基元类型为什么需要为null?需要考虑以下两个场景: 1、数据库中一个int字段可以被设置为null。在C#中,值被取出来后,为了将它赋值给int类型,不得不首先判断一下它是否为null。如果将null直接赋值给int类型,会引发异常。 2、在一个分布式系统中,服务器需要接收并解析来自客户端的数据。一个int型数据在传输的过程中可能会丢失或者原创 2017-07-31 17:07:43 · 273 阅读 · 0 评论 -
Tip4 TryParse比Parse好
Tip4 TryParse比Parse好public static double Parse(string s)public static bool TryParse(sting s, out double result)Parse转换失败会引发异常,通过捕获异常来设置初始值 试验: static void Main(string[] args) {原创 2017-07-31 17:05:27 · 243 阅读 · 0 评论 -
Tip3 区别对待强制转型as和is
Tip3 区别对待强制转型as和is 如果类型之间都上溯到了某个共同的基类,那么根据此基类进行的转型应该使用as。子类于子类之间的转型,则应该提供转型操作符,以便进行强制转型 class FirstType { public string Name { get; set; } } class SecondType { public原创 2017-07-31 17:02:03 · 327 阅读 · 0 评论 -
Tip2 使用默认转型方法
Tip2 使用默认转型方法 1、使用类型的转换运算符int i=0;float j=0;j=i; //隐式转换i=(int)j; //显式转换2、使用类型内置的Parse、TryParse,或者如ToString、ToDouble、ToDateTime等方法 3、使用帮助累提供的方法如System.Convert类、System.BitConverter类进行类型转换原创 2017-07-31 17:00:14 · 302 阅读 · 0 评论 -
Tip16 元素数量可变的情况下不应使用数组
Tip16 元素数量可变的情况下不应使用数组数组一旦被创建,长度就不能改变。如果我们需要一个动态且可变长度的集合,就应该使用ArrayList或List<T>来创建。List<T>是ArrayList的泛型实现,它省去了拆箱和装箱带来的开销。注:不能肆意对数组指定过大的长度,这会让数组成为一个大对象(占用内存超过85000字节的对象),大对象在回收过程中会带来效率很低的问题。如果一定要动态改变数组的原创 2017-08-03 16:27:53 · 287 阅读 · 0 评论