簡體   English   中英

為什么在原始類型實例上調用Object類的某些函數需要裝箱?

[英]Why calling some functions of the Object class, on a primitive type instance, need boxing?

我發現如果我運行以下代碼行。

int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
                 //function from System.Object

沒有裝箱,但是如果我調用i.GetType() (來自System.Object另一個派生函數)代替GetHashCode() ,則需要裝箱來調用GetType() ,為什么不能調用GetType()在原始類型實例上直接,沒有拳擊,而它可以調用GetHashCode()而不用拳擊?

這里的關鍵是GetType()不是虛擬的,不能被覆蓋。 由於結構是有效的sealed ,方法不能被重寫比任何結構 ,所以運行時和編譯器可以處理已經覆蓋靜態調用結構的方法。

如果你編寫一個結構(罕見),你應該覆蓋所有方法,如ToString()Equals()GetHashCode() ,正是出於這個原因。 如果你不這樣做必須裝箱。 但是, GetType() 無法被覆蓋,因此需要裝箱。

這實際上導致一些奇怪的邊緣情況與Nullable<T>和裝箱,因為空的Nullable<T>框為null ,所以:

int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom

我認為原因是GetHashCode直接在System.Int32上實現,你調用System.Int32 :: GetHashCode()。 如果在值類型上調用已知成員函數,則無需使用框。

暫無
暫無

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

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