[C#]Nullable 應用在實值型別 Value Type

在 .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类型