2010-07-05 16 views
11

有很多方法可以將對象轉換/轉換爲另一種方式,這些方法之間的區別和沒有區別爲什麼有很多方法可以實現一件事?這不是對語言的損害嗎?C#中的投射/轉換方法之間的區別

讓我們說對象obj字符串。

obj.ToString() 
obj as string 
(string)obj 
Convert.ToString(obj) 
+1

能夠以多種方式製造事物並不會造成損害。這是一個強大的資源。就像在口頭語言中一樣:你可以用各種方式表達自己(這可能沒有細微差別)。 – 2010-07-05 09:25:35

回答

17

您在這裏做不同的事情:

  • obj.ToString() - 這是對對象的ToString()方法的調用。該對象返回一個字符串,因爲它已被編程。
  • obj as string - 這是一個嘗試將對象轉換爲字符串,該字符串可能會也可能不會失敗(如果失敗,結果爲null),則不會拋出異常。
  • (串)目標文件 - 這是obj一個顯式的類型string,你告訴編譯器obj一個string。如果obj不是字符串類型,您將得到一個轉換異常。
  • Convert.ToString(obj) - 這是對Convert類的顯式調用,以返回obj的字符串表示形式。

有這些許多不同的方式來獲得從object一個string,因爲每個人都是不同的有細微的差別。是的,在許多情況下,返回的字符串將是相同的,但不能保證。

+0

等類型「創建」.ToString()即使這不存在? – eugeneK 2010-07-05 09:38:50

+0

@eugeneK - 在.NET中,所有對象都從'object'繼承。由於定義了ToString(),所有對象都有一個ToString()方法,可以覆蓋它。據我所知,'Convert.ToString(obj)'只是簡單地調用它,但實質上,你所說的是正確的 - 'Convert'試圖儘可能地從「對象」中「創建」一個字符串。 – Oded 2010-07-05 09:45:05

+1

@eugeneK,Convert.ToString使用該類型的IConvertible接口來確定如何執行轉換。這可能與.ToString()有不同的實現,儘管它們通常是相同的。也可以爲一個類查找TypeConverter並將其轉換爲字符串(如果轉換器支持它),這是設計人員在屬性網格中將實例表示爲字符串時使用的機制。 – 2010-07-05 14:43:37

2
obj as string 
(string)obj 

「爲」 操作符是安全的。如果不能轉換則返回null,則()操作引發的異常

+0

那麼爲什麼()存在?在「正確」編程之前,例外情況會更好地處理。我們可以詢問obj的結果值是否爲string == null並處理「exception」。 – eugeneK 2010-07-05 09:38:04

+0

@eugeneK「AS」運算符僅適用於引用類型。你不能這樣做 int r = stmng as int; 要求重設類型 你可以調用這個if(obj IS string) – Arseny 2010-07-05 09:56:12

+0

@eugeneK,顯式類型轉換(而不是'as')包含一個斷言,你相信這個轉換會成功。當你相信這種情況時,如果投射失敗則拋出異常是有意義的。基本上,如果你確實發生了無法有效處理演員陣容失敗的情況,那麼你明確地施放了陣容。 – 2010-07-05 14:48:04

2

是有區別的:

  • 的ToString是依賴於對象本身定義字符串表示會是什麼樣子的方法。
  • as關鍵字是引用轉換:Note that the as operator only performs reference conversions and boxing conversions.
  • 使用()來指定類型是explicit conversion而作爲關鍵字是implicit
  • 使用Convert類實際上只是幫助你解析它,Convert.ToString可能只是包裝對象上的.ToString()。
+0

三個詞是指什麼參考和拳擊轉換? – eugeneK 2010-07-05 09:39:22

+0

@eugeneK,我不知道三個字,但檢查拳擊/拆箱MSDN出來http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx – 2010-07-05 10:36:03

1

首先,鑄造與將對象轉換爲字符串非常不同。 Casting不會將對象轉換爲任何東西,它只是假設另一種類型,而ToString確實從對象創建了一個字符串(如果對象已經是字符串,這當然可能是無操作的)。

有用於Arseny解釋理由二鑄造操作:該as運營商將返回一個空引用而()運營商將引發異常如果轉換是不可能的。

有兩種ToString方法,因爲obj.ToString()當然只適用於obj確實是一個對象,而不是一個int。對於後面的情況,你必須使用Convert.ToString()。類似地,當objnull時,則obj.ToString()將引發異常,而Convert.ToString()可返回一些合理的字符串(例如"null")。

1

[是]什麼那些

之間的差有類型轉換的2種方式和範圍的庫中的類和方法。類型轉換用於已經技術上密切並且強相關的對象(值)。

轉換(Convert類和SomeType.Parse()方法)實際上正在轉換數據類型(字符串到Int32不能是一個強制轉換)。

爲什麼有這麼多的方法來實現 有一件事?

鑄造和轉換是重要的,經常使用的操作。這就是爲什麼我們有一個細粒度的工具集,當然有很多重疊。

2

通常有幾種方法可以做基本相同的事情,但變化很小。鑄造和轉換之間有明顯區別,例如,您可以將int轉換爲string,但不能將int轉換爲string

對於是否損害語言,您有一個有效的觀點,但主要不是因爲有很多做事的方式,而是因爲它們可能不一致地實施。當你實現類時,你必須小心,以使它們按預期行事。檢查平等是一個例子,在那裏你可以使用一個方法或者操作員:

x == y 
x.Equals(y) 

如果實現其中的一個類而不是其他,編譯器可以幫助您與既有的警告要讓班級正常運作。