Office中国论坛/Access中国论坛
标题:
【原创】ValueType下的Equals代码(.net1.x和4.0缺2.0)
[打印本页]
作者:
faunus
时间:
2014-2-22 16:29
标题:
【原创】ValueType下的Equals代码(.net1.x和4.0缺2.0)
.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;
}
}
作者:
faunus
时间:
2014-2-22 16:30
.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;
}
作者:
faunus
时间:
2014-2-22 16:31
顺便指正一下书中的错误《Effective C#》第十章中关于结构类型hashcode的结论:
值类型自带的GetHashCode是以其第一个成员的GetHashCode值作为其的返回值。
有的值类型都继承自 System.ValueType。System.ValueType 重写了 System.Object 提供的 Equals 方法实现。System.ValueType.Equals 方法在内部首先使用反射机制(本书20章将予以探讨)来得到类型所有的实例字段。
的我猜测是:为了性能,也行有了新的做法.
[1]不要盲从本书上的说教,要自己验证了才算数,更要注意一下论证的环境 .(三段论)
[2]可能.net的版本在变,情况同样会改变,除非是C#语言规范中认定的内容 .
所以我只能假设上面的代码适合于.net1.x
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3