4.13 初始化泛型變數為它們的預設值
問題
您的泛型類包含一個變數,它的類型和類中定義的型別參數一樣。在構造泛型類時,您希望這個變數被初始化為它的預設值。
解決方案
簡單地使用default關鍵字把變數初始化為它的預設值:
public class DefaultValueExample<T>
{
T data = default(T);
public bool IsDefaultData()
{
T temp = default(T);
if (temp.Equals(data))
{
return (true);
}
else
{
return (false);
}
}
public void SetData(T val)
{
data = val;
}
}
下面的代碼使用了這個類:
public static void ShowSettingFieldsToDefaults()
{
DefaultValueExample<int> dv = new DefaultValueExample<int>();
// 檢查成員data是否已經被設定為它的預設值; 返回true.
bool isDefault = dv.IsDefaultData();
Console.WriteLine("Initial data: " + isDefault);
// 設定成員data.
dv.SetData(100);
// 再次檢查, 這次返回false.
isDefault = dv.IsDefaultData();
Console.WriteLine("Set data: " + isDefault);
第一次調用IsDefaultData返回true,而第二次調用返回false,輸出如下:
Initial data: True
Set data: False
討論
當對一個和泛型的型別參數一樣類型的變數進行初始化時,您不能僅僅設定它為null。當型別參數是一個實值型別如int或char會怎麼樣呢?這將無法工作,因為實值型別不能為null。您可能會想到可空類型,如long?或Nullable<long>可以被設定為null(參考秘訣4.7瞭解更多關於可空類型的內容)。但編譯器無從得知將使用何種類型實參來構造類型。(譯者註:這裡的意思是編譯器並不知道使用者使用的是實值型別還是參考型別,因為可空類型僅僅是對實值型別而言)
default關鍵字允許您告訴編譯器在編譯期將會使用這個變數的預設值。如果類型實參提供了一個數字值(如int,long,decimal),那麼預設值為0。如果類型實參提供的是參考型別,那麼預設值為null。如果類型實參提供了一個結構體,那麼結構體的預設值會把它的每個成員進行初始化:數字類型為0,參考型別為null。
閱讀參考
查看秘訣4.7;查看MSDN文檔中的“default Keyword in Generic Code”主題。
(完)