c#的Equals

c#的 Equals有很多方式。

[b]1 静态 object.Equals[/b]
	public static bool Equals(object objA, object objB)
{
return objA == objB || (objA != null && objB != null && objA.Equals(objB));
}

说明: 比较引用,比较是否为null 并且 调用类型的Equals方法。

[b]2 静态 object.ReferenceEquals[/b]
	public static bool ReferenceEquals(object objA, object objB)
{
return objA == objB;
}

说明:比较引用。

[b]3 运算符 ==[/b]
[list]
[*] 对于引用类型(class)如果重载了Equals,则调用该Equals,默认调用 object.Equals方法。
[*] 对于值类型(struct)如果重载了Equals,则调用该Equals,否则,调用ValueType.Equals方法。
[/list]
		public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
RuntimeType runtimeType = (RuntimeType)base.GetType();
RuntimeType runtimeType2 = (RuntimeType)obj.GetType();
if (runtimeType2 != runtimeType)
{
return false;
}
if (ValueType.CanCompareBits(this))
{
return ValueType.FastEqualsCheck(this, obj);
}
FieldInfo[] fields = runtimeType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
for (int i = 0; i < fields.Length; i++)
{
object obj2 = ((RtFieldInfo)fields[i]).InternalGetValue(this, false);
object obj3 = ((RtFieldInfo)fields[i]).InternalGetValue(obj, false);
if (obj2 == null)
{
if (obj3 != null)
{
return false;
}
}
else if (!obj2.Equals(obj3))
{
return false;
}
}
return true;
}

说明:
[list]
[*] 1 比较 是否为null
[*] 2 比较 类型是否一致
[*] 3 查看能否按位比较
[*] 3.1 按位进行比较
[*] 4 通过反射技术,逐个字段(Field)进行比较。
[*] 4.1 比较字段是否为null
[*] 4.2 调用字段的Equals
[/list]
[b]4 实例方法 Equals[/b]
		public virtual bool Equals(object obj)
{
return object.InternalEquals(this, obj);
}

遗憾,由于方法是外部实现,无法看到具体逻辑。。。
根据很多的测试,与 == 默认的行为一致,除了一个是方法,一个是运算符,但都可以重载。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值