簡體   English   中英

==運算符如何與System.Type一起使用

[英]How == operator works with System.Type

typeof(int) == typeof(int)

此表達式如何計算?

當我使用

Console.WriteLine(typeof(int));

它使用對象的ToString()方法輸出System.Int32 所以我假設在這個表達式中

 typeof(int) == typeof(int)

ToString()將其都轉換為System.Int32 ,然后將其字符串進行比較。 真的嗎 ??

或其他事情正在發生

否。像其他所有類通常一樣,它使用相等比較器( ==System.Type被覆蓋,並且對兩個實例之一檢查Equals方法是否相等。

typeof(int)返回Type ,因此調用Type.Equals 您可以在此處查看源代碼。

您將看到它最終使用它來比較兩個實例:

return (Object.ReferenceEquals(this.UnderlyingSystemType, o.UnderlyingSystemType));

所述typeof()算子解析為一個System.Type ,並且==上操作者System.Type 檢查引用相等 這對於System.Type就足夠了,因為有以下保證:

表示類型的Type對象是唯一的; 也就是說,兩個Type對象引用在且僅當它們表示相同類型時才引用同一對象。 這允許使用引用相等性比較Type對象。

http://msdn.microsoft.com/en-us/library/42892f65.aspx

所以答案是,==檢查兩種類型是否都指向內存中完全相同的對象,並且如果原始對象屬於同一類型,則由於上面的引用,可以保證它們的類型都指向內存中的相同對象。 。

typeof(int) == typeof(int)的IL代碼為

IL_0000:  ldtoken     System.Int32
IL_0005:  call        System.Type.GetTypeFromHandle
IL_000A:  ldtoken     System.Int32
IL_000F:  call        System.Type.GetTypeFromHandle
IL_0014:  call        System.Type.op_Equality

您可以看到它調用了靜態相等運算符

public static bool operator ==(Type left, Type right)

我們無法在參考源中看到此方法的作用,因為它顯然是外部方法,但我猜是它要么調用Equals方法,要么在本機代碼中執行類似的比較。

Console.WriteLine(object);的事實Console.WriteLine(object); 打印出一個string並不意味着Type類型總是一個字符串,類似於您可以打印出一個int值而無需通過其ToString方法查看和比較該int方式。

==運算符將測試類型的相等性,並且絕不涉及ToString()

我想您可能有點困惑-如果我不得不猜測-在打印某些內容和將其保存在內存之間的區別。

暫無
暫無

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

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