問題:ee6d64b9
你有一個泛型類包含一個由類自身定義型別引數的變數。由於對泛型物件的約束,你希望這個變數被初始化為其預設值。
解決方法:
非常簡單的方法:只要使用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;
}
}
{
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;
}
}
使用這個類的程式碼可以參考這裡:
using System;
using System.Collections.Generic;
using System.Text;
namespace SetDefaultValueExample
{
class Program
{
static void Main(string[] args)
{
DefaultValueExample<int> dv = new DefaultValueExample<int>();
// 檢查是否被設定為預設值,如果是返回true
bool isDefault = dv.IsDefaultData();
Console.WriteLine("Initial data: " + isDefault);
// 設定資料
dv.SetData(100);
// 再次檢查,這個時候應該返回false
isDefault = dv.IsDefaultData();
Console.WriteLine("Set data: " + isDefault);
}
}
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;
}
}
}
using System.Collections.Generic;
using System.Text;
namespace SetDefaultValueExample
{
class Program
{
static void Main(string[] args)
{
DefaultValueExample<int> dv = new DefaultValueExample<int>();
// 檢查是否被設定為預設值,如果是返回true
bool isDefault = dv.IsDefaultData();
Console.WriteLine("Initial data: " + isDefault);
// 設定資料
dv.SetData(100);
// 再次檢查,這個時候應該返回false
isDefault = dv.IsDefaultData();
Console.WriteLine("Set data: " + isDefault);
}
}
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;
}
}
}
當初始化一個相同型別引數的變數時,你不能只是設定這些變數為null。如果這個變數是值型別,比如說int或char,那會是什麼呢?那將不能執行,因為值型別不能是null的。你也許會想到一個nullable型別,比如long?或者Nullable<long>,可以被設為空。然而,編譯器無法知道使用者將使用什麼型別引數去構造這個型別。
default關鍵字允許你告訴編譯器在編譯時,這個型別的預設值將被使用。如果提供的型別引數是數值(int,long,decimal),那麼預設值將會是0。如果是引用型別,那麼預設值將會是null。如果是結構體,那麼這個結構體的預設值將根據其每一個欄位的型別設為0或null。