有很多方法可以將對象轉換/轉換爲另一種方式,這些方法之間的區別和沒有區別爲什麼有很多方法可以實現一件事?這不是對語言的損害嗎?C#中的投射/轉換方法之間的區別
讓我們說對象obj字符串。
obj.ToString()
obj as string
(string)obj
Convert.ToString(obj)
有很多方法可以將對象轉換/轉換爲另一種方式,這些方法之間的區別和沒有區別爲什麼有很多方法可以實現一件事?這不是對語言的損害嗎?C#中的投射/轉換方法之間的區別
讓我們說對象obj字符串。
obj.ToString()
obj as string
(string)obj
Convert.ToString(obj)
您在這裏做不同的事情:
ToString()
方法的調用。該對象返回一個字符串,因爲它已被編程。null
),則不會拋出異常。obj
一個顯式的類型string
,你告訴編譯器obj
是一個string
。如果obj
不是字符串類型,您將得到一個轉換異常。obj
的字符串表示形式。有這些許多不同的方式來獲得從object
一個string
,因爲每個人都是不同的和有細微的差別。是的,在許多情況下,返回的字符串將是相同的,但不能保證。
等類型「創建」.ToString()即使這不存在? – eugeneK 2010-07-05 09:38:50
@eugeneK - 在.NET中,所有對象都從'object'繼承。由於定義了ToString(),所有對象都有一個ToString()方法,可以覆蓋它。據我所知,'Convert.ToString(obj)'只是簡單地調用它,但實質上,你所說的是正確的 - 'Convert'試圖儘可能地從「對象」中「創建」一個字符串。 – Oded 2010-07-05 09:45:05
@eugeneK,Convert.ToString使用該類型的IConvertible接口來確定如何執行轉換。這可能與.ToString()有不同的實現,儘管它們通常是相同的。也可以爲一個類查找TypeConverter並將其轉換爲字符串(如果轉換器支持它),這是設計人員在屬性網格中將實例表示爲字符串時使用的機制。 – 2010-07-05 14:43:37
obj as string
(string)obj
「爲」 操作符是安全的。如果不能轉換則返回null,則()操作引發的異常
那麼爲什麼()存在?在「正確」編程之前,例外情況會更好地處理。我們可以詢問obj的結果值是否爲string == null並處理「exception」。 – eugeneK 2010-07-05 09:38:04
@eugeneK「AS」運算符僅適用於引用類型。你不能這樣做 int r = stmng as int; 要求重設類型 你可以調用這個if(obj IS string) – Arseny 2010-07-05 09:56:12
@eugeneK,顯式類型轉換(而不是'as')包含一個斷言,你相信這個轉換會成功。當你相信這種情況時,如果投射失敗則拋出異常是有意義的。基本上,如果你確實發生了無法有效處理演員陣容失敗的情況,那麼你明確地施放了陣容。 – 2010-07-05 14:48:04
是有區別的:
Note that the as operator only performs reference conversions and boxing conversions.
三個詞是指什麼參考和拳擊轉換? – eugeneK 2010-07-05 09:39:22
@eugeneK,我不知道三個字,但檢查拳擊/拆箱MSDN出來http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx – 2010-07-05 10:36:03
首先,鑄造與將對象轉換爲字符串非常不同。 Casting不會將對象轉換爲任何東西,它只是假設另一種類型,而ToString確實從對象創建了一個字符串(如果對象已經是字符串,這當然可能是無操作的)。
有用於Arseny解釋理由二鑄造操作:該as
運營商將返回一個空引用而()
運營商將引發異常如果轉換是不可能的。
有兩種ToString方法,因爲obj.ToString()
當然只適用於obj
確實是一個對象,而不是一個int。對於後面的情況,你必須使用Convert.ToString()
。類似地,當obj
爲null
時,則obj.ToString()
將引發異常,而Convert.ToString()
可返回一些合理的字符串(例如"null"
)。
[是]什麼那些
之間的差有類型轉換的2種方式和範圍的庫中的類和方法。類型轉換用於已經技術上密切並且強相關的對象(值)。
轉換(Convert
類和SomeType.Parse()
方法)實際上正在轉換數據類型(字符串到Int32不能是一個強制轉換)。
爲什麼有這麼多的方法來實現 有一件事?
鑄造和轉換是重要的,經常使用的操作。這就是爲什麼我們有一個細粒度的工具集,當然有很多重疊。
通常有幾種方法可以做基本相同的事情,但變化很小。鑄造和轉換之間有明顯區別,例如,您可以將int
轉換爲string
,但不能將int
轉換爲string
。
對於是否損害語言,您有一個有效的觀點,但主要不是因爲有很多做事的方式,而是因爲它們可能不一致地實施。當你實現類時,你必須小心,以使它們按預期行事。檢查平等是一個例子,在那裏你可以使用一個方法或者操作員:
x == y
x.Equals(y)
如果實現其中的一個類而不是其他,編譯器可以幫助您與既有的警告要讓班級正常運作。
能夠以多種方式製造事物並不會造成損害。這是一個強大的資源。就像在口頭語言中一樣:你可以用各種方式表達自己(這可能沒有細微差別)。 – 2010-07-05 09:25:35