在 .NET 1.1 使用int ,Datetime 等實值型別時,無法給 Null 為初始值,在自己經驗中都給予
MinValue 來做初始值,而 .NET 2.0 以後,可以透過 Nullable 的方式來做初始值給值方式及檢查。
摘要:
在 .NET 1.1 使用int ,Datetime 等實值型別時,無法給 Null 為初始值,在自己經驗中都給予
MinValue 來做初始值,而 .NET 2.0 以後,可以透過 Nullable 的方式來做初始值給值方式及檢查。
實做說明:
Nullable 是 .NET 2.0 所新增的類別,
主要可以用來針對 實值型別 (參考一) 給予 Null 當初始值 及 檢查是否為 null ,
這邊先瞭解關於常見 實值型別 型別有哪些,而 DateTime 在.NET Framework 實值型別(參考二)
而之前自己的經驗,在對 inet , Datetime 做處理是 null 的時候,
以 DateTime 來說會使用 DateTime.MinValue 的方式,來代表一個 Null 的值,
也聽別人的經驗說,就大家說好一個某一個日期就是null的值(但這樣非常不好,請大家不要這樣)
而使用Nullable就能方便處理實值型別初始值 的問題
Nullable 的使用也很簡單
Nullable<型別> 變數名 = null ;或 型別? 變數 = null;
以下透過簡單小範例來比較用 Minvalue 與 Nullable的應用
protected void Page_Load(object sender, EventArgs e)
{
//一般給予DateTime 一個Min初始值
DateTime dt;
dt = DateTime.MinValue;
//做檢查的方式
if (dt != DateTime.MinValue)
{
Write("dt不是null", "");
Write("dt:", dt.ToString());
}
else
{
Write("dt是null", "");
}
//使用 Nullable 的方式給予 null
Nullable<DateTime> dt2 = null;
dt2 = DateTime.Now;
//透過 Nullable 類別的屬性 HasValue來做檢查
if (dt2.HasValue)
{
//透過 Nullable 類別的屬性 Value 來取值
Write("dt2.Value:", dt2.Value.ToString());
//也可以直接取本來DateTime的值
Write("dt2:", dt2.ToString());
//透過Nullable建構的DateTime型別還是Datetime
Write("dt2.GetType().Name:", dt2.GetType().Name);
Write("dt2不是null", "");
}
else
{
Write("dt2是null", "");
}
//透過簡短式宣告
DateTime? dt3 = null;
if (dt3.HasValue)
{
Write("dt3不是null", "");
}
else
{
Write("dt3是null", "");
}
//int 使用的範例
int a = int.MinValue;
Write("a",a.ToString() + "<br/>");
//以Nullable
Nullable<int> b = null;
//簡短式
int? c = 9;
//b= 1;
if (!b.HasValue)
{
Write("b","null");
}
else
{
Write("b", b.ToString() + "Not null");
Write("b GetType", b.GetType().Name);
}
Write("c.GetType().Name",c.GetType().Name);
if (!c.HasValue)
{
Write("c:","null");
}
else
{
Write("c:", c.ToString() + "Not null");
}
}
private void Write(string inText1,string inText2)
{
Response.Write(inText1.ToString() +":"+ inText2.ToString() + "<br/>");
}
畫面顯示資料
dt是null:
dt2.Value::2008/8/2 下午 10:25:38
dt2::2008/8/2 下午 10:25:38
dt2.GetType().Name::DateTime
dt2不是null:
dt2是null:
a:-2147483648
b:null
c.GetType().Name:Int32
c::9Not null
總結:
在 .NET 2.0 之後,在針對實值型別能夠給予 Null 的方式,透過 Nullable<>,
再程式開發時,就能避免給予實值型別初始直定義的不同,在程式判斷上有不同的作法,
這是自己遇到的小狀況,也不太知道是否正確,還請有使用Nullable的朋友可以一起討論。
參考資源:
參考一: http://msdn.microsoft.com/zh-tw/library/ya5y69ds(VS.80).aspx
參考二:http://msdn.microsoft.com/zh-tw/library/a4ty5t0t(VS.80).aspx
可以指定為Null的實值型別 (Nullable Type)
.NET Framework 2.0 筆記:Nullable Types
在C#中使用Nullable类型