设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1887|回复: 2
打印 上一主题 下一主题

【原创】ValueType下的Equals代码(.net1.x和4.0缺2.0)

[复制链接]
跳转到指定楼层
1#
发表于 2014-2-22 16:29:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
.net1.x


  • public override bool Equals(Object obj)  
  • {  
  •     if (obj == null) return false;  
  •     else  
  •     {  
  •         Type type = GetType();  
  •         if (type != obj.GetType()) return false;  
  •         FieldInfo[] fields = type.GetFields(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance);  
  •         int posn;  
  •         Object value1,value2;  
  •         for (posn = 0; posn < fields.Length; ++posn)  
  •         {  
  •             value1 = fields[posn].GetValue(this);  
  •             value2 = fields[posn].GetValue(obj);  
  •             if (value1 == null)  
  •             {  
  •                 if (value2 != null) return false;  
  •             }  
  •             else if (value2 == null)  
  •             {  
  •                 return false;  
  •             }  
  •             else if (!value1.Equals(value2))  
  •             {  
  •                 return false;  
  •             }  
  •         }  
  •         return true;  
  •     }  
  • }  



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2014-2-22 16:30:34 | 只看该作者
.net4.0


  • public override bool Equals(object obj)  
  • {  
  •     if (obj == null)  
  •     {  
  •         return false;  
  •     }  
  •     RuntimeType type = (RuntimeType) base.GetType();  
  •     RuntimeType type2 = (RuntimeType) obj.GetType();  
  •     if (type2 != type)  
  •     {  
  •         return false;  
  •     }  
  •     object a = this;  
  •     if (CanCompareBits(this))  
  •     {  
  •         return FastEqualsCheck(a, obj);  
  •     }  
  •     FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);  
  •     for (int i = 0; i < fields.Length; i++)  
  •     {  
  •         object obj3 = ((RtFieldInfo) fields).InternalGetValue(a, false);  
  •         object obj4 = ((RtFieldInfo) fields).InternalGetValue(obj, false);  
  •         if (obj3 == null)  
  •         {  
  •             if (obj4 != null)  
  •             {  
  •                 return false;  
  •             }  
  •         }  
  •         else if (!obj3.Equals(obj4))  
  •         {  
  •             return false;  
  •         }  
  •     }  
  •     return true;  
  • }  



3#
 楼主| 发表于 2014-2-22 16:31:09 | 只看该作者
顺便指正一下书中的错误《Effective C#》第十章中关于结构类型hashcode的结论:
值类型自带的GetHashCode是以其第一个成员的GetHashCode值作为其的返回值。

有的值类型都继承自 System.ValueType。System.ValueType 重写了 System.Object 提供的 Equals 方法实现。System.ValueType.Equals 方法在内部首先使用反射机制(本书20章将予以探讨)来得到类型所有的实例字段。

的我猜测是:为了性能,也行有了新的做法.
[1]不要盲从本书上的说教,要自己验证了才算数,更要注意一下论证的环境 .(三段论)
[2]可能.net的版本在变,情况同样会改变,除非是C#语言规范中认定的内容 .

所以我只能假设上面的代码适合于.net1.x

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-8 08:30 , Processed in 0.087743 second(s), 26 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表