C# Object.Equals方法深入研究
System.Object对象是所有托管类型直接或者间接的继承类.
例如,所有的值类型都继承自System.ValueType;而System.ValueType则继承自System.Object;但是,System.ValueType重写了System.Object中关于实现值类型相关的语义.
System.Object.Equals方法有两个实现:
public virtual bool Equals(object obj)
public static bool Equals(object objA, object objB)
我们用反编译工具反编译System.dll得到这两个方法的实现源码:
我们进一步深究InteralEquals方法,得到下面的实现:
这里我们可以看到Equals在实现的过程中的调用顺序和原理.
在各个对象实现Equals的时候,引用类型大部分都重写了相关的语义,具体的对象中Equals的比较方式,
我们可以用ILDASM反汇编来得到IL中间代码.
等我过段时间研究下MSIL的语法,在引用一些更加具有说服力的反汇编中间代码.
例如,所有的值类型都继承自System.ValueType;而System.ValueType则继承自System.Object;但是,System.ValueType重写了System.Object中关于实现值类型相关的语义.
System.Object.Equals方法有两个实现:
public virtual bool Equals(object obj)
public static bool Equals(object objA, object objB)
我们用反编译工具反编译System.dll得到这两个方法的实现源码:
public virtual bool Equals(object obj) { return InternalEquals(this, obj); } |
public static bool Equals(object objA, object objB) { if (objA == objB) { return true; } if ((objA != null) && (objB != null)) { return objA.Equals(objB); } return false; } |
[MethodImpl(MethodImplOptions.InternalCall)] internal static extern bool InternalEquals |
在各个对象实现Equals的时候,引用类型大部分都重写了相关的语义,具体的对象中Equals的比较方式,
我们可以用ILDASM反汇编来得到IL中间代码.
等我过段时间研究下MSIL的语法,在引用一些更加具有说服力的反汇编中间代码.
posted on 2007-10-08 11:16 lbq1221119 阅读(3105) 评论(0) 编辑 收藏 举报