改善C#编程的50个建议(6-10)

  当实现你自己的类的相等方法时,一般重写第3个方法,在判断有值类型的相等时重写第4个方法,第1、2个方法永远不要重写它。

  对象的相等应当满足数学上相等的几个性质:1.自身等于自身。2.可传递性,即a==b,b==c,那么a==c。3.对称性,即a==b,那么b==a。

  第一个方法ReferenceEquals,在当两个变量指向同一个对象的时候返回True,否则返回False.

  该方法只比较对象的标识,而不会比较对象的内容,所以当该方法应用在值类型的变量时,永远返回False.--(因为此时会为每个值类型变量产生装箱操作生成不同的对象),同时该方法执行的效率最块,因为它只比较对象标识。

http://www.huihui.cn/share/32960004
http://www.huihui.cn/share/32958280
http://www.huihui.cn/share/32957358
http://www.huihui.cn/share/32956760
http://www.huihui.cn/share/32955260
http://www.huihui.cn/share/32954604
http://www.huihui.cn/share/32954146
http://www.huihui.cn/share/32953522
http://www.huihui.cn/share/32952548
http://www.huihui.cn/share/32950878
http://www.huihui.cn/share/32949902
http://www.huihui.cn/share/32949532
http://www.huihui.cn/share/32948930
http://www.huihui.cn/share/32252372
http://www.huihui.cn/share/32251552
http://www.huihui.cn/share/32251048
http://www.huihui.cn/share/32250130
http://www.huihui.cn/share/32249588
http://www.huihui.cn/share/29997150
http://www.huihui.cn/share/29996422
http://www.huihui.cn/share/29995536
http://www.huihui.cn/share/29994856
http://www.huihui.cn/share/29993976

http://yueyang.uz.taobao.com/

http://yueyang.uz.taobao.com/

http://www.kingmoke.cn
http://www.lvsenvshen.cn
http://www.shmcauto.com.cn
http://www.tsjqwj.com.cn
http://www.ptsbw.com.cn
http://www.sonqi.net.cn
http://www.tzcxdd.com
http://www.gongneihzp.com
http://www.aivino.com.cn
http://www.xycarpet.cn

http://yueyang.uz.taobao.com/

  第二个方法Equals的实现就和如下代码一样:

  public static new bool Equals(object left, object right)

  {

  // Check object identity

  if (Object.ReferenceEquals(left, right) )

  return true;

  // both null references handled above

  if (Object.ReferenceEquals(left, null) ||

  Object.ReferenceEquals(right, null))

  return false;

  return left.Equals(right);

  }

  注意System.ValueType未重写1、2方法,只重写了第3个方法,故自定义值类型,也不建议重写这两个方法。(自定义值类型一般也会重写第4个方法==)

  但是重写的Equals方法比较糟糕,因为它要比较所有的成员变量,而它又不知道这些成员的具体类型,所以在这里它使用了反射技术,众所周知值类型的反射是比较耗性能的(存在装箱、拆箱操作)。因此我们在定义自己的值类型的时候,应当重写Equals方法,这样会提高效率。

  而引用类型,尽量使用预定义的相等方法,在当你重写了Equals()时,你将也需要实现IEquatable接口,因为不实现泛型接口,就会存在一个类型转换的问题,派生类转换为基类可能正常,也就是派生类对象==基类对象,但是基类无法转换为派生类,所以基类对象不等于派生类对象,因此违背了数学意义上的相等。所以我们应当通过实现IEquatable接口方法,来让基类和派生类都转换为接口对象,这样它们就能相互进行转换再判断是否相等了。

  自定义引用类型一般不建议重写==方法。

  7.GetHashCode()的陷阱

  GetHashCode()只用在一个地方:在基于Hash的集合里为Key定义Hash值,通常是在HashSet和Dictionary容器里。

  GetHashCode()存在不少问题,对于引用类型,它效率低下;对于值类型,它通常又是不正确的。因此不建议重写此函数,而且在使用这个函数时也需要加倍小心。

  8.偏爱查询语法而不是循环

  对比下面两块代码:

  使用循环给数组赋值并输出

  int[] foo = new int[100];

  for(int num = 0; num < foo.Length; num++)

  foo[num] = num * num;

  foreach (int i in foo)

  Console.WriteLine(i.ToString());

  使用查询语法(LINQ)赋值及Lambda表达式来输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值