2014-04-16 63 views
1

我想知道當我們做演員時對象發生了什麼。對象的佈局是否得到重構或方法表是否更改,或僅用於確保我的分配在運行時不會中斷?在.NET中投射對象時會發生什麼變化?

+2

你說的是什麼樣的演員?用戶定義的轉化可以做他們喜歡的任何事建立在引用類型之間的轉換除了檢查類型是否適合之外什麼也不做。 – CodesInChaos

回答

0

無!

所有你正在做的是「假裝」這是一個不同的類型。當然,如果它不從該類型繼承(或實際上是向下轉換時的類型實例),則轉換失敗,並且在使用「as」運算符進行強制轉換時不會獲得任何內容(null),而顯式(C-Style )會投擲。

除非,那就是,你正在處理值類型(特別是號碼類型)。如果你做到以下幾點:

double myDouble = 1.5f; 
int myInt = (int)myDouble; 
double myOtherDouble = (double)myInt; 

您將獲得1敏和myOtherDouble,因爲執行轉換當數被截斷。大多數其他值類型甚至不支持這種類型的轉換,因爲轉換沒有定義。

+0

如果你執行一個明確的演員並且演員無效,你不會得到空。 InvalidCastException將被拋出。 –

+0

感謝您的澄清,更新! – BradleyDotNET

1

沒有。演員陣容改變了指針指向的邏輯假設。

的對象沒有任何東西改變 - 所有發生的事情是進行檢查,對客體是否是假定類型的。

如果你有A和B:A,和A =新的A()

然後基本上

變種B =(B)一

要求編譯器檢查A實際上是一個B.

現在,如果一個是不斷爲C的實例創建(C:A),然後 - 這可以和將打擊在這一點上。

+0

也可以使用[AS](http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx):)即'變種B =一個爲B;' –

+0

是,也可以用戶另一種語言。 questin是關於C#和CASTS的,而不是其他語言構造。 – TomTom

+0

Tom,as運算符是C#構造。如果不允許演員陣容,則LOC「var B =(B)a」會引發錯誤。我想Humpty試圖解釋一個優美的演員...... D – cliffhanger2087

1

如果你投一個引用類型,什麼都不會發生。這只是一個運行時檢查,該對象實際上是指定的類型。在某些情況下 - 如ByteDouble - 值將更改爲匹配新的數據類型。實際上它不會改變,但您將獲得代表相同值的新數據類型的新值。如果涉及用戶定義的轉換,則由實施情況決定。

+0

這就是我提到用戶定義的轉換的原因。 –

2

誠實的回答是這取決於。一些轉換類型只涉及裝箱和取消裝箱,這只是改變了代碼在運行時被解釋的方式。底層對象實際上並沒有改變。這種類型的鑄造涉及例如從stringobject(作爲C#中的所有東西)之間的鑄件(作爲stringobject)。

http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

或者,如果有自定義的參與/用戶自定義投運營商,那麼什麼事情都可能發生。演員陣營可以創建一個全新的對象,這個對象是投射的原始代表。這種演員的例子是intstring

http://msdn.microsoft.com/en-us/library/09479473.aspx

+0

謝謝馬蒂..希望你不介意我解決你這樣..;) – cliffhanger2087

1

通常沒有任何反應到基礎數據 - 它只是決定了代碼是如何與對象進行交互。

但是 - 一些「鑄就」其實做一個轉換,這意味着他們改變對象的基礎數據。

例如:

(double)(int)1.1; 

轉換1.1爲整數(其中截斷到1),然後將其轉換回double,在這種情況下將返回1.0。

您也可以參考類型定義explicit conversions

public static explicit operator Celsius(Fahrenheit fahr) 
{ 
    return new Celsius((5.0f/9.0f) * (fahr.degrees - 32)); 
} 

Fahrenheit fahr = new Fahrenheit(100.0f); 
Console.Write("{0} Fahrenheit", fahr.Degrees); 
Celsius c = (Celsius)fahr; 

注意技術上原始數據並沒有在這兩種情況下改變 - 投返回與新數據對象。

+0

+1:我想確切的答案是「沒有任何反應到原來的對象」。這是關於實際分配給賦值左側的內容的非常好的解釋(可能與原始對象相關或不相關)。還有的「中投」的行爲更多的情況 - 未裝箱錯誤類型'(串)(對象)1'將拋出... –

+0

很好的例子斯坦.. – cliffhanger2087

2

由於所有其他人指出鑄件本身不會改變物體正投。

這就是說,有值得作出有關超載的explicit conversions的行爲,乍看如強制類型轉換的能力點。如果一個類型重載的顯式轉換運算符則可以(儘管它真的不應該)改變被轉換的對象。

public class EvilClass 
{ 
    public int SomeProperty { get; set; } 

    public static explicit operator SomeOtherType(B bObj) 
    { 
     obj.SomeProperty = -1; 

     return SomeOtherType.CreateFromEvilClass(bObj); 
    } 
} 

然後,給用戶,這看起來像一個投:

EvilClass evilClass = new EvilClass(); 
evilClass.SomeProperty = 42; 

SomeOtherType sot = (SomeOtherType)evilClass; // looks like cast.. 

Console.WriteLine(evilClass.SomeProperty);  // Will print -1, not 42 
相關問題