2011-06-10 46 views
2

我試圖消化在C#規範,其中規定(4.2節)這種說法:在引用類型和值類型在C#規範輕微混亂

引用類型是類類型, 接口類型,數組類型或委託類型。

我知道結構可以實現接口。結構是價值類型。

所以,我很難調和這些信息。這是否意味着結構在通過接口類型處理時表現爲引用類型?這將意味着,你可以得到一個值類型的引用...

回答

3

這是正確的。在需要接口引用的上下文中使用值類型時,它將被裝箱。同樣的事情發生,如果System.Object是必需的。

什麼你不能有一個接口參照值類型實例在棧上,或者在另一個內部類。拳擊過程創建一個副本。

1

是,struct S可實現一個接口,但它們不是一個接口類型。 A struct是一種值類型,當需要時將被裝箱。

3

是的,你可以得到一個值類型的引用。任何時候將值類型分配給變量或將其作爲參數傳遞給需要Object類型的方法時,值類型都會隱式包裝在對象實例中 - 這是一個稱爲裝箱的過程。拳擊正在創建一個包含值的對象引用。當盒裝對象被分配或使用像一個值類型,然後它被拆箱並提取值。

1

其實現,如果它被澆鑄到所述接口,但如果它被澆鑄到被約束爲實現該接口的通用類型的接口將盒裝一個結構。例如:

 
void Compare<T>(T thing1, T Thing2) where T:IComparable<T> 
{ 
    return thing1.CompareTo(Thing2); 
} 

注意的是,雖然上面的代碼中使用結構時,比較值類型T的兩個對象需要三個拷貝操作避免了拳擊。如果參數作爲參考,而不是通過值傳遞,與值類型的性能將得到加強,在受損的參考型性能(並且,當然,相容性與現有IComparable的<Ť>和的IComparer <Ť>)爲代價的。

+0

有趣。感謝您的回答! – Cameron 2011-10-06 17:23:13