2008-12-21 118 views
5

雖然使用反射拆卸的.Net源代碼,我來到在Object類中的Equals實現InternalEquals(對象objA,對象objB)的實現,它是指哪裏是

bool InternalEquals(object objA, object objB); 

這又是指到

internal static extern bool InternalEquals(object objA, object objB); 

我現在迷茫關於在哪裏可以找到這種InternalEquals(object objA, object objB)功能的實現,以及如何使用此功能和它的.Net組件定義,也如果每個,一切都從頭開始編寫此功能該.Net源代碼,那麼爲什麼我無法找到這個函數的實現。

回答

12

它被宣佈爲[MethodImpl(MethodImplOptions.InternalCall)]。這意味着它在CLR本身中實現,作爲本機過程而不是.NET程序集。

您可以通過查看Microsoft SSCLI (aka Rotor)來查看類似的CLR源代碼。

在SSCLI 2.0它實施爲(在sscli20/clr/src/vm/comobject.cpp):

FCIMPL2(FC_BOOL_RET, ObjectNative::Equals, Object *pThisRef, Object *pCompareRef) 
{ 
    CONTRACTL 
    { 
     THROWS; 
     DISABLED(GC_NOTRIGGER); 
     INJECT_FAULT(FCThrow(kOutOfMemoryException);); 
     MODE_COOPERATIVE; 
     SO_TOLERANT;   
    } 
    CONTRACTL_END; 

    if (pThisRef == pCompareRef)  
     FC_RETURN_BOOL(TRUE); 

    // Since we are in FCALL, we must handle NULL specially. 
    if (pThisRef == NULL || pCompareRef == NULL) 
     FC_RETURN_BOOL(FALSE); 

    MethodTable *pThisMT = pThisRef->GetMethodTable(); 

    // If it's not a value class, don't compare by value 
    if (!pThisMT->IsValueClass()) 
     FC_RETURN_BOOL(FALSE); 

    // Make sure they are the same type. 
    if (pThisMT != pCompareRef->GetMethodTable()) 
     FC_RETURN_BOOL(FALSE); 

    // Compare the contents (size - vtable - sink block index). 
    BOOL ret = memcmp(
     (void *) (pThisRef+1), 
     (void *) (pCompareRef+1), 
     pThisRef->GetMethodTable()->GetBaseSize() - sizeof(Object) - sizeof(int)) == 0; 

    FC_GC_POLL_RET(); 

    FC_RETURN_BOOL(ret); 
} 
FCIMPLEND 
+0

鏈接SSCLI: http://www.microsoft。 com/downloads/details.aspx?FamilyId = 8C09FD61-3F26-4555-AE17-3121B4F51D4D&displaylang = en – 2008-12-21 10:43:23

0

首先,找到在sscli20 \ CLR \ SRC \ VM \ ecall.cpp函數映射( 「InternalEquals」 - > ObjectNative ::等於) :

FCFuncStart(gObjectFuncs) 
    FCIntrinsic("GetType", ObjectNative::GetClass, CORINFO_INTRINSIC_Object_GetType) 
    FCFuncElement("InternalGetHashCode", ObjectNative::GetHashCode) 
    FCFuncElement("InternalEquals", ObjectNative::Equals) 
    FCFuncElement("MemberwiseClone", ObjectNative::Clone) 
FCFuncEnd() 

下,找到一種實現ObjectNative ::等於(由邁赫達德Afshari出版)