一個對象的屬性中有一個datetime類型的屬性,在賦值時未給予賦值,此時系統會分配給它一個最小的時間,不會是null值,與int類型相似,datetime也不會有null類型,
先來看一段代碼:
null值用來表示數據類型未被賦予任何值,它是一種引用類型且它只能賦值給引用類型,由於string是一個特殊的引用類型,因此編譯器不會報錯。
但是當它賦值給值類型int類型的時候,編譯器就會報錯:
我們知道數據庫中是有NULL值的,例如下面的一張表,年齡(int類型)是可以為空的,代表目前不知道此人年齡,那么當我們在C#代碼向數據庫插入數據時,就會需要一個可空的int類型。
但是int、bool等這些類型不能表示數據庫中的“Null” 。因此C#提供了“可空類型”這種語法,只要在類型后加?就構成了可空的數據類型,比如int?、bool?,這樣
int? i=null 就可以了。解決數據庫中int可以為null,而C#中int不能為null的問題。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace 可空數據類型
- {
- class Program
- {
- static void Main(string[] args)
- {
- //string s1 = null;
- int? i = null;
- Console.WriteLine(i);
- }
- }
- }
由於i為空,所以不會有任何數據顯示。
T?其實是System.Nullable<T>的簡寫,可空類型在ADO.NET編程中大量使用,用來解決數據庫與C#代碼數據類型不一致的問題。
來看一下msdn文檔中關於System.Nullable的說明:
System.Nullable的定義:
由它的定義可知:判斷可空類型是否為空,用i==null或者i.HasValue;得到可空變量的值,int i1=(int)i.Value或者int i1=i.Value。
類型轉換:不可空類型賦值給可空類型無需顯式轉換(一定成功),可空類型賦值給不可空類型則需顯式轉換(不一定成功)
如果int? i3 = null;
- static void Main(string[] args)
- {
- int? i = null;
- int? i3 = null;
- //int? i3 = 8;//不可空類型賦值給可空類型無需顯式轉換(一定成功)
- if (i3 == null)
- {
- Console.WriteLine("i3為空");
- }
- else
- {
- i3++;
- int i4 = (int)i3;//可空類型賦值給不可空類型則需顯式轉換(不一定成功)例如i3為空,則不成功!
- Console.WriteLine("i3不為空,{0}", i3);
- }
- if (i3.HasValue)
- {
- int i4 = i3.Value;
- Console.WriteLine("i3不為空,{0}", i3);
- }
- else
- {
- Console.WriteLine("i3為空!");
- }
- }
如果int? i3 = 8;
- static void Main(string[] args)
- {
- int? i = null;
- //int? i3 = null;
- int? i3 = 8;//不可空類型賦值給可空類型無需顯式轉換(一定成功)
- if (i3 == null)
- {
- Console.WriteLine("i3為空");
- }
- else
- {
- i3++;
- int i4 = (int)i3;//可空類型賦值給不可空類型則需顯式轉換(不一定成功)例如i3為空,則不成功!
- Console.WriteLine("i3不為空,{0}", i3);
- }
- if (i3.HasValue)
- {
- int i4 = i3.Value;
- Console.WriteLine("i3不為空,{0}", i3);
- }
- else
- {
- Console.WriteLine("i3為空!");
- }
- }