1. 程式人生 > >.NET中的識別符號?表示可空型別

.NET中的識別符號?表示可空型別

C#中的 int?是什麼意思?

結構作為值型別,是不能賦值為null的,而int32是個結構..有時(特別是與資料庫互動時)需要賦值為null,就在結構後面加個?識別符號,表示可以接受null空型別

int?:表示可空型別,就是一種特殊的值型別,它的值可以為null
用於給變數設初值得時候,給變數(int型別)賦值為null,而不是0
int??:用於判斷並賦值,先判斷當前變數是否為null,如果是就可以賦役個新值,否則跳過

public int? a=nullpublic int b()
{
return this.a ?? 0;
}

值型別後面加問號表示可為空null(Nullable 結構)


Nullable是.NET 2.0中新提供的一種用於標明一個值型別是否可以為空的技術。

對於一個型別,如果既可以給它分配一個值,也可以給它分配空引用null(表示沒有任何值),我們就說這個型別是可空的。

因此,可空型別可表示一個值,或表示不存在任何值。例如,類似 String 的引用型別就是可空型別,而類似 Int32 的值型別不是可空型別。Nullable 結構支援將值型別擴充套件為可以為null,但不支援在引用型別上使用,因為引用型別本身就是可空的。

因為值型別的容量只夠表示適合於該型別的值,因此它不可為空;值型別沒有表示空值所需的額外容量。

例:public int? age;
int? num = null;   正確


int num=null;     錯誤
---------------------------------------------------------------------------------------------------------------------------
微軟MSDN是提示如下例子:
http://msdn.microsoft.com/zh-cn/support/1t3y8s4s(VS.80).aspx

class NullableExample
{
     static void Main()
     {
         int? num = null;
         if
(num.HasValue == true) { System.Console.WriteLine("num = " + num.Value); } else { System.Console.WriteLine("num = Null"); } //y is set to zero int y = num.GetValueOrDefault(); // num.Value throws an InvalidOperationException if num.HasValue is false try { y = num.Value; } catch (System.InvalidOperationException e) { System.Console.WriteLine(e.Message); } } }
以上將顯示輸出:

num = Null

Nullable object must have a value.

可空型別概述
可空型別具有以下特性:

可空型別表示可被賦值為 null 值的值型別變數。無法建立基於引用型別的可空型別。(引用型別已支援 null 值。)。

語法 T? 是 System.Nullable<T> 的簡寫,此處的 T 為值型別。這兩種形式可以互換。

為可空型別賦值與為一般值型別賦值的方法相同,如 int? x = 10; 或 double? d = 4.108;。

如果基礎型別的值為 null,請使用 System.Nullable.GetValueOrDefault 屬性返回該基礎型別所賦的值或預設值,例如 int j = x.GetValueOrDefault();

請使用 HasValue 和 Value 只讀屬性測試是否為空和檢索值,例如 if(x.HasValue) j = x.Value;

如果此變數包含值,則 HasValue 屬性返回 True;或者,如果此變數的值為空,則返回 False。

如果已賦值,則 Value 屬性返回該值,否則將引發 System.InvalidOperationException。

可空型別變數的預設值將 HasValue 設定為 false。未定義 Value。

使用 ?? 運算子分配預設值,當前值為空的可空型別被賦值給非空型別時將應用該預設值,如 int? x = null; int y = x ?? -1;。

不允許使用巢狀的可空型別。將不編譯下面一行:Nullable<Nullable<int>> n;