2011-08-28 71 views
8

我想知道下面的語句是否曾經爲參考類型返回不同的結果,還是它們是相同的?默認(T)與Activator.CreateInstance(T)

  1. default(T)
  2. Activator.CreateInstance(T)

如果它們是相同的,可以總是使用默認值(T),在此實例中,如果目的是要輸出的T?:

的默認值
if (typeof(T).IsValueType || typeof(T) == typeof(String)) 
{ 
    return default(T); 
} 
else 
{ 
    return Activator.CreateInstance<T>(); 
} 

Best way to test if a generic type is a string? (c#)

TA!

+2

不,引用類型的默認值(T)返回null,CreateInstance()不會產生,因爲它創建了一個類型爲T的對象。很難猜測這段代碼真的嘗試了什麼做。 –

+2

也不是'default(string)'null嗎? – BoltClock

+0

謝謝你澄清混淆!代碼示例是混淆的一部分,我在它下面鏈接的stackoverflow帖子中看到它。 – Cel

回答

14

它們完全不同。

  1. default(T),當T是引用類型,永遠是null
  2. Activator.CreateInstance<T>()將使用默認構造函數創建該類型的新實例(如果存在),否則將引發MissingMethodException
3

T是引用類型時,它們將始終返回不同的結果。 default(T)將返回null,而Activator.CreateInstance<T>()將返回使用T的公共無參數構造函數創建的T的新實例。

+3

或者,如果它找不到這樣的構造函數,則拋出異常。 – BoltClock

+0

當然。這是一個例外,它根本不會返回任何東西。 – cdhowie

2

default(T)將返回null作爲參考類型。 Activator.CreateInstance<T>()不會。 A string是.NET中的一個引用類型。

+0

+1爲OP的最後一行 – nawfal

5

對於引用類型,default(T)將爲空,而CreateInstance實際上會返回一個T類型的新對象(或者如果沒有合適的構造函數會失敗),因此結果永遠不會相同。

2

不知道whate你是問,但它們是不同的:

default(T)返回null如果T是不是值類型...的CreateInstance調用創建一個實例,如果有一個調用默認的構造函數(否則拋出異常)...

相關問題