2011-01-19 230 views
3

最近我正在學習值類型,我有點困惑。另外,cast和unboxing都使用相同的語法 - (預期類型)(object),對吧? 那麼類型之間的簡單轉換,即轉換還​​是轉換呢?鑄造,拆箱,轉換..?

int x = (int)2.5; //casting? 

object a=x; 
int Y=(int)a; //unboxing I think 

Random r=new Random(); 
object X=r; 
Random R=(Random)X; // casting 
+0

嗨@Lojol,歡迎堆棧溢出!如果你關心,你可能能夠幫助我們解決你的問題中的編輯問題。就像:你問過這個後,你自己改變了標籤嗎?請參閱我們的「元」的網站上的討論:[?掛起的編輯沒有透露任何的變化,可能是由於在寬限期編輯](http://meta.stackexchange.com/questions/75463/pending-edit-does-不透露任何變化,可能是由於編輯在寬限期)謝謝! – Arjan 2011-01-19 12:25:31

+0

@Steve,同樣適合你! (請參閱我上面的評論。)例如:您是否嘗試重新排列標籤? – Arjan 2011-01-19 12:40:22

回答

8

有很多的事情要考慮這裏,但是讓我們來解決最簡單的第一:

什麼是語法(type)expression

那麼,在它的基本形式,它被認爲是鑄造。您將表達式從一種類型轉換爲另一種類型。而已。

然而,到底發生了什麼,這取決於類型,和很多其他的事情。

如果鑄造價值型別的東西,你依賴於參與申報處理這個鑄造操作的兩種類型之一。換句話說,值類型需要定義一個可以轉換爲其他類型的轉換運算符,或者其他類型需要定義可以從原始類型轉換的轉換運算符。

什麼是符不,是到那個運營商的作者。這是一種方法,所以它可以做任何事情。

鑄造值類型到一些其它類型的給你一個不同的值,一個單獨的值的類型,或者一個新的參考類型,包含在鑄造後的新的數據。

例子:

int a = (int)byteValue; 

裝箱和拆箱進場當你施放值類型和引用類型,通常object,或接口值式工具之一。

例子:鑄造界面時

object o = intValue; // boxing 
int i = (int)o;  // unboxing 

拳擊也發揮了作用。讓我們假設「someValueType」是一個結構,這也實現了IDisposable:

IDisposable disp = (IDisposable)someValueType; // boxed 

鑄造引用類型,可以做別的事情爲好。

首先,可以定義參與值類型,相同的轉換運算符,這意味着鑄造一個參考類型到另一個可以返回一個全新的對象,包含很大的不同類型的信息。鑄造引用類型時

拳擊不發揮作用,除非你投一個引用類型返回值類型(見上文)。

例子:

string s = (string)myObjectThatCanBeConvertedToAString; 

或者,你可以重新詮釋的參考,讓你還是指有問題的同一個對象,但你是通過對不同類型的眼鏡看它。

實施例:

IDisposable disp = (IDisposable)someDisposableObject; 
0

拳擊和拆箱是由編譯器在幕後完成的。所以,正確的意見將是

int x = (int)2.5; //casting with conversion 

object a=x; //casting with boxing 
int Y=(int)a; //casting with unboxing 

Random r=new Random(); 
object X=r; 
Random R=(Random)X; //casting without unboxing 

有關轉換VS轉換檢查這個問題:What is the difference between casting and conversion?

1

強制轉換轉換的一種形式,基本上是這樣。

代碼中的所有註釋都是正確的。

但重要的是要注意參考轉換與其他轉換之間的差異。還有你的最終轉化爲參考的轉換 - 它保持代表性的身份,所以XR的價值觀是相同的對象都引用。

將此與double轉換爲int轉換(顯着更改表格)並拆箱(將框內的值複製到變量)。

區別對於某些主題很重要,例如一般差異 - 僅適用於參考類型,因爲可以使用參考轉換。基本上,CLR會檢查它是否合適,然後運行適當的代碼,而不必對引用本身執行任何實際的轉換。

2

上取消裝箱的一個重要的限制是,你只能拆箱的確切值型(或其可爲空的等價物),而不是另一個值型原始值類型是可兌換至。

int myInt = 1; 
object x = myInt; // box 
int unbox1 = (int)x; // successful unbox 
int? unbox2 = (int?)x; // successful unbox 
long unbox3 = (long)x; // error. Can't unbox int to long 
long unbox4 = (long)(int)x; // works. First it unboxes to int, and then converts to long 

另一個有趣的一點是,可爲空值類型被作爲盒裝其非空類型,並且可以是裝箱作爲可空和非空類型兩者。由於具有價值null框參考null它的類型信息的可空拳擊過程中丟失。