.Net Generic中的default(T)跟new T()

先來看一段.Net C#中的generic程式碼。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestVS2008
{
public class TestGeneric
{
public static T CreateGeneric<T>()
where T : new()
{
return new T();
}

public static T CreateGeneric_2<T>()
{
return default(T);
}

public static void Test()
{
int i = CreateGeneric<int>();

TestGeneric t = CreateGeneric<TestGeneric>();

TestGeneric t2 = CreateGeneric_2<TestGeneric>();
}
}
}

上面這段程式碼中,主要想要測試的是在使用泛型之下, new  T()跟default(T)的差別。

首先看到CreateGeneric_2<T>()這個函式,它針對所需的型別T並沒有加入任何的限制條件。任何型別都可以帶入這個函式來使用。所以當它需要傳回一個T型別的物件時,它只能用default(T)的方式來產生物件。這種方式對一般類別或是value型別都適用。當你的T型別為value型別時,就會傳回所有bit均為0的值。當你的T型別為一般類別時,則會傳回null值。

再來看CreateGeneric<T>()這個函式,它限定說所帶入的T型別需要有預設的建構子。當然value型別也是可以適用,而一般的類別則必須提供預設建構子(不帶有任何參數的建構子)。它要產生一個T型別的物件時,就可以直接用new T();的方式來產生一個物件。所以它一定不會傳回null值。

兩者的差別,在於CreateGeneric<T>()這個函式加入了一個限制條件,就是你的型別必須提供預設建構子。如果沒有的話,就無法使用這個函式。

此時,你必須考慮的是,這限制式是否是必要的了。因為加入過多不必要的限制式會造成其它人更無法使用你的泛型函式(或類別)。而這當然就違反了你當初建立這個泛型函式(或類別)的用意了。你當然是希望越常被使用越好囉。

留言

這個網誌中的熱門文章

DOS Batch指令檔中如何記錄log資訊

用捷徑方式執行需帶入命令列參數的Windows Form程式

使用regular expression來match中括號(square bracket)