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。