簡體   English   中英

.NET中如何比較類型? CLR如何確定它們相同或不同?

[英]How are types compared in .NET? How does the CLR identify they are the same or different?

Type.Equals(Type)如何比較類型以了解它們是否相同?

最初的問題很困惑,因為我在體內的存在以及我認為將指導該問題的內容。 忘記那部分。 問題在標題中。

編輯:拉瑟五世·拉克森最恰當地提出了我的問題:

“組成.NET類型標識的是什么……”如果在兩個不同的項目/程序集中,我聲明完全相同的類型(直到名稱空間),. NET認為它們是不同的,為什么?

它是這樣實現的:(來自參考源)

public virtual bool Equals(Type o)
{ 
    if ((object)o == null) 
        return false;

    return (Object.ReferenceEquals(this.UnderlyingSystemType, o.UnderlyingSystemType));
}
public override bool Equals(object o)
{
    return (((o != null) && (o is Type)) && (this.UnderlyingSystemType == ((Type) o).UnderlyingSystemType));
}

這來自最新的反映來源。

ECMA-335公共語言基礎結構分區I和II規定每種類型都可以通過給定的類型簽名來識別 它說明了IL如何表示此簽名,以及虛擬執行系統應如何解釋該簽名,但它保留了一致的運行時實現實際上必須如何實現類型簽名的實現(據我所知)。

通過元數據中表示的類型聲明將新類型(值類型和引用類型)引入CTS。 此外,元數據是一種結構化的方式,表示CLI用來定位和加載類,在內存中布置實例,解析方法調用,將CIL轉換為本機代碼,實施安全性以及設置運行時上下文邊界的所有信息。

但是,對於您的問題,無論實際上如何實現UnderlyingSystemType它都將使用以下內容與唯一引用相關聯:

  • 部件
  • 模組
  • 命名空間
  • 父類型(如果有)
  • 類型本身

分區II具有用於TypeDef的物理元數據(第22.37節),該元數據對該信息進行了編碼。

分區III包含IL,該IL表示將元數據令牌(稱為RuntimeHandle到堆棧上。 類型,方法和字段有不同的句柄,具體取決於提供給IL指令的令牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM