2010-05-06 53 views
3

當我執行的基準鑄造類型到底發生了什麼,並在編譯器或運行時的水平值類型,反之亦然(拳擊和未拳擊)? 任何機構可以用於以下四個條件解釋一下嗎?請隨意添加條件,如果我錯過任何。到底發生了

1. Stream stream = new MemoryStream(); 
    MemoryStream memoryStream = (MemoryStream) stream; 
2. double k=10.0; 
    int l = (int)k; 
3. object k =20; 
    int l = (int)k; 
4. int k =23; 
    double m = k; 

回答

4

有三種類型的轉換會在這裏的:

轉換1爲基準的轉換。 CLR將檢查stream的值是否爲實際上是MemoryStream(或子類型)的引用,然後將引用簡單複製到memoryStream。沒有新的對象創建或類似的東西。此後,雙方streammemoryStream指向同一個對象。內存中兩個變量的值將完全相同。

轉換2和轉換4是數值轉換 - 它們正在從一種數字形式更改爲另一種。這基本上是一個FPU類型的操作。轉換2是明確的(因爲它可能會丟失信息),而轉換4是隱含的,但基本上它們是相似的,因爲它們都在改變實際的表示。

轉換3是拆箱操作:CLR檢查k的值是對盒裝int(或兼容類型,如基礎類型爲int的枚舉)的引用,並將該值從那個盒子變成l

你可以看到IL所有這一切產生的編譯代碼,然後使用反彙編或反思,當然。

埃裏克利珀有blog post關於這一切,你可能會發現有用的。