我想知道當我們做演員時對象發生了什麼。對象的佈局是否得到重構或方法表是否更改,或僅用於確保我的分配在運行時不會中斷?在.NET中投射對象時會發生什麼變化?
回答
無!
所有你正在做的是「假裝」這是一個不同的類型。當然,如果它不從該類型繼承(或實際上是向下轉換時的類型實例),則轉換失敗,並且在使用「as」運算符進行強制轉換時不會獲得任何內容(null),而顯式(C-Style )會投擲。
除非,那就是,你正在處理值類型(特別是號碼類型)。如果你做到以下幾點:
double myDouble = 1.5f;
int myInt = (int)myDouble;
double myOtherDouble = (double)myInt;
您將獲得1敏和myOtherDouble,因爲執行轉換當數被截斷。大多數其他值類型甚至不支持這種類型的轉換,因爲轉換沒有定義。
如果你執行一個明確的演員並且演員無效,你不會得到空。 InvalidCastException將被拋出。 –
感謝您的澄清,更新! – BradleyDotNET
沒有。演員陣容改變了指針指向的邏輯假設。
的對象沒有任何東西改變 - 所有發生的事情是進行檢查,對客體是否是假定類型的。
如果你有A和B:A,和A =新的A()
然後基本上
變種B =(B)一
要求編譯器檢查A實際上是一個B.
現在,如果一個是不斷爲C的實例創建(C:A),然後 - 這可以和將打擊在這一點上。
也可以使用[AS](http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx):)即'變種B =一個爲B;' –
是,也可以用戶另一種語言。 questin是關於C#和CASTS的,而不是其他語言構造。 – TomTom
Tom,as運算符是C#構造。如果不允許演員陣容,則LOC「var B =(B)a」會引發錯誤。我想Humpty試圖解釋一個優美的演員...... D – cliffhanger2087
如果你投一個引用類型,什麼都不會發生。這只是一個運行時檢查,該對象實際上是指定的類型。在某些情況下 - 如Byte
到Double
- 值將更改爲匹配新的數據類型。實際上它不會改變,但您將獲得代表相同值的新數據類型的新值。如果涉及用戶定義的轉換,則由實施情況決定。
這就是我提到用戶定義的轉換的原因。 –
誠實的回答是這取決於。一些轉換類型只涉及裝箱和取消裝箱,這只是改變了代碼在運行時被解釋的方式。底層對象實際上並沒有改變。這種類型的鑄造涉及例如從string
到object
(作爲C#中的所有東西)之間的鑄件(作爲string
是和object
)。
http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx
或者,如果有自定義的參與/用戶自定義投運營商,那麼什麼事情都可能發生。演員陣營可以創建一個全新的對象,這個對象是投射的原始代表。這種演員的例子是int
到string
。
謝謝馬蒂..希望你不介意我解決你這樣..;) – cliffhanger2087
通常沒有任何反應到基礎數據 - 它只是決定了代碼是如何與對象進行交互。
但是 - 一些「鑄就」其實做一個轉換,這意味着他們改變對象的基礎數據。
例如:
(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;
注意技術上原始數據並沒有在這兩種情況下改變 - 投返回與新數據新對象。
+1:我想確切的答案是「沒有任何反應到原來的對象」。這是關於實際分配給賦值左側的內容的非常好的解釋(可能與原始對象相關或不相關)。還有的「中投」的行爲更多的情況 - 未裝箱錯誤類型'(串)(對象)1'將拋出... –
很好的例子斯坦.. – cliffhanger2087
由於所有其他人指出鑄件本身不會改變物體正投。
這就是說,有值得作出有關超載的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
- 1. .NET將對象投射到...對象的目標是什麼?
- 2. 當在Javascript中重新分配對象變量時,原始對象會發生什麼變化?
- 3. 在反序列化過程中對象會發生什麼?
- 4. 爲什麼在cin中斷時會發生變化? C++
- 5. 底層文件未鏈接時,fstream對象會發生什麼變化?
- 6. 當你拋出異常時,python對象會發生什麼變化
- 7. 案例類具有隨播對象時會發生什麼變化?
- 8. 當在Obj-C中的方法內創建對象時,對象的內存會發生什麼變化?
- 9. 在Java中實例化對象時發生了什麼?
- 10. 當我在Hibernate中合併對象時會發生什麼?
- 11. 在java中打印對象時會發生什麼
- 12. 當我在C++中爲對象賦值時,會發生什麼?
- 13. 在Qt中,線程完成時對象會發生什麼?
- 14. 在Php中,當一個對象無法實例化時會發生什麼?
- 15. WPF:綁定到對象的屬性;當對象改變時會發生什麼?
- 16. 通過bool進行char往返投射會發生什麼?
- 17. 爲什麼在嘗試追加時,Array中的對象值發生了變化?
- 18. 對象發生變化時通知TObjectList
- 19. 這個對象會發生什麼
- 20. OnPause onResume中的計時器會發生什麼變化
- 21. 爲什麼Guid在保存記錄時會發生變化?
- 22. 爲什麼在調用IEnumerable.Contains()時需要投射動態對象?
- 23. 爲什麼在反射投射時隱式投射工作會拋出異常?
- 24. 當MKMAPVIEW範圍發生變化時會觸發什麼事件
- 25. 爲什麼投射會在java中產生正確的結果?
- 26. 投射後目標對象會扮演什麼樣的角色?
- 27. 投射對象
- 28. 投射對象
- 29. 當您產生activerecord對象時會發生什麼?
- 30. 當JVM退出時,堆中的對象會發生什麼?
你說的是什麼樣的演員?用戶定義的轉化可以做他們喜歡的任何事建立在引用類型之間的轉換除了檢查類型是否適合之外什麼也不做。 – CodesInChaos