C# Object.Equals方法深入研究
System.Object對象是所有托管類型直接或者間接的繼承類.
例如,所有的值類型都繼承自System.ValueType;而System.ValueType則繼承自System.Object;但是,System.ValueType重寫了System.Object中關(guān)于實現(xiàn)值類型相關(guān)的語義.
System.Object.Equals方法有兩個實現(xiàn):
public virtual bool Equals(object obj)
public static bool Equals(object objA, object objB)
我們用反編譯工具反編譯System.dll得到這兩個方法的實現(xiàn)源碼:
我們進一步深究InteralEquals方法,得到下面的實現(xiàn):
這里我們可以看到Equals在實現(xiàn)的過程中的調(diào)用順序和原理.
在各個對象實現(xiàn)Equals的時候,引用類型大部分都重寫了相關(guān)的語義,具體的對象中Equals的比較方式,
我們可以用ILDASM反匯編來得到IL中間代碼.
等我過段時間研究下MSIL的語法,在引用一些更加具有說服力的反匯編中間代碼.
例如,所有的值類型都繼承自System.ValueType;而System.ValueType則繼承自System.Object;但是,System.ValueType重寫了System.Object中關(guān)于實現(xiàn)值類型相關(guān)的語義.
System.Object.Equals方法有兩個實現(xiàn):
public virtual bool Equals(object obj)
public static bool Equals(object objA, object objB)
我們用反編譯工具反編譯System.dll得到這兩個方法的實現(xiàn)源碼:
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 |
在各個對象實現(xiàn)Equals的時候,引用類型大部分都重寫了相關(guān)的語義,具體的對象中Equals的比較方式,
我們可以用ILDASM反匯編來得到IL中間代碼.
等我過段時間研究下MSIL的語法,在引用一些更加具有說服力的反匯編中間代碼.
posted on 2007-10-08 11:16 lbq1221119 閱讀(3125) 評論(0) 收藏 舉報
浙公網(wǎng)安備 33010602011771號