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得到这两个方法的实现源码:
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;
            }
            
我们进一步深究InteralEquals方法,得到下面的实现:
[MethodImpl(MethodImplOptions.InternalCall)]
            internal static extern bool InternalEquals
            (object objA, object objB);
这里我们可以看到Equals在实现的过程中的调用顺序和原理.

在各个对象实现Equals的时候,引用类型大部分都重写了相关的语义,具体的对象中Equals的比较方式,
我们可以用ILDASM反汇编来得到IL中间代码.
等我过段时间研究下MSIL的语法,在引用一些更加具有说服力的反汇编中间代码.

posted on 2007-10-08 11:16  lbq1221119  阅读(3105)  评论(0编辑  收藏  举报

导航