MSDN:裝箱是將值類型轉換為 object 類型或由此值類型實現的任何接口類型的過程。
C# In Depth 的2.3.4中提到“為一個類型的值調用ToString,Equals或GetHashCode方法時,如果該類型沒有覆蓋這些方法,也會發生裝箱。”
分析:
1.ToString
如果值類型沒有重寫ToString方法,會調用ValueType類中的ToString方法
public override String ToString(){ return this.GetType().ToString();}
這里,this.GetType()會繼續調用Object.cs類的GetType()方法,為了調用GetType()方法,
CLR需要使用指向一個類型對象的指針,這個指針只能通過對該值類型裝箱獲得。
因此,在值類型沒用重寫ToString方法時,為該值類型調用ToString方法是會進行裝箱操作。
2.Equals
如果值類型沒有重寫Equals方法,會調用ValueType類中的Equals方法
public override bool Equals (Object obj){ }
這時會將值類型轉換為Object類型,會發生裝箱操作。
3.GetHashCode
貌似會發生裝箱。未完待續。
新聞熱點
疑難解答