C# 可空類型(Nullable)

眾所周知,不能為值類型分配空值。例如,int i = null 將拋出編譯時(shí)錯(cuò)誤。

c# 2.0引入了可空類型,允許你將null賦值給值類型變量。您可以使用 Nullable<t> 來(lái)聲明可空類型,其中 T 是一個(gè)類型。

可空類型定義

Nullable<int> i = null;

可空類型可以表示其基礎(chǔ)值類型的正確值范圍,還外加一個(gè)額外的空值。例如,Nullable < int > 可以分配從 -2147483648 到 2147483647 的任何值,或者一個(gè) null 值。

Nullable 類型是 System.Nullable < t > struct 的實(shí)例。

[Serializable]
public struct Nullable<T> where T : struct
{        
    public bool HasValue { get; }
      
    public T Value { get; }
        
    // 其他實(shí)現(xiàn)
}

Int 類型的 nullable 與普通 int 類型相同,加上一個(gè)標(biāo)志,表示 int 是否有一個(gè)值(是否為 null)。。其余所有都是編譯器魔術(shù),它將“ null”視為有效值。

static void Main(string[] args)
{
    Nullable<int> i = null;

    if (i.HasValue)
        Console.WriteLine(i.Value); // 或 Console.WriteLine(i)
    else
        Console.WriteLine("Null");
}
輸出:
Null

如果對(duì)象已分配值,則在返回 true;如果未分配任何值或已分配 null 值,則返回 false。

如果 NullableType.value 類型為 null 或未分配任何值,則使用 NullableType.value 訪問(wèn)該值將引發(fā)運(yùn)行時(shí)異常。例如,如果 i 為 null,值將拋出一個(gè)異常:

無(wú)效使用可空類型

如果不為null,則 使用 GetValueOrDefault() 方法獲取實(shí)際值;如果為null,則使用默認(rèn)值。例如:

static void Main(string[] args)
{
    Nullable<int> i = null;

    Console.WriteLine(i.GetValueOrDefault()); 
}

可空類型的簡(jiǎn)寫語(yǔ)法

您可以使用“?” 運(yùn)算符來(lái)簡(jiǎn)化語(yǔ)法,例如int ?, long?而不是使用Nullable <T>。

int? i = null;
double? D = null;

Null 合并運(yùn)算符( ?? )

使用 '??' 運(yùn)算符,將可為空的類型分配給不可為空的類型。

int? i = null;
            
int j = i ?? 0;

Console.WriteLine(j);
輸出:
0

在上面的示例中,i是可為null的int,如果將其分配給不可為null的int j,則如果i為null,它將拋出運(yùn)行時(shí)異常。因此,為了降低出現(xiàn)異常的風(fēng)險(xiǎn),我們使用了“ ??” 運(yùn)算符,如果i為null,則將0賦給j。

using System;
namespace CalculatorApplication
{
   class NullablesAtShow
   {
         
      static void Main(string[] args)
      {
         
         double? num1 = null;
         double? num2 = 3.14157;
         double num3;
         num3 = num1 ?? 5.34;      // num1 如果為空值則返回 5.34
         Console.WriteLine("num3 的值: {0}", num3);
         num3 = num2 ?? 5.34;
         Console.WriteLine("num3 的值: {0}", num3);
         Console.ReadLine();

      }
   }
}

輸出結(jié)果:

num3 的值: 5.34
num3 的值: 3.14157

賦值規(guī)則

可空類型的賦值規(guī)則與值類型的賦值規(guī)則相同。如果在函數(shù)中將可空類型聲明為局部變量,則必須在使用它之前為其賦值。如果它是任何類的字段,那么默認(rèn)情況下它將有一個(gè)空值。

例如,聲明并使用以下int類型的nullable而不分配任何值。編譯器將給出“使用未分配的局部變量'i'”錯(cuò)誤:

未分配的可為空的類型錯(cuò)誤

在下面的示例中,int類型的nullable是該類的字段,因此不會(huì)產(chǎn)生任何錯(cuò)誤。

class MyClass
{
    public Nullable<int> i;
}
class Program
{
    static void Main(string[] args)
    {
        MyClass mycls = new MyClass();

        if(mycls.i == null)
            Console.WriteLine("Null");
    }
}
輸出:
Null

Nullable 類比較方法

Null被認(rèn)為小于任何值。所以比較運(yùn)算符不能用于null。看以下示例,其中i既不小于j,也不大于j,也不等于j:

static void Main(string[] args)
{
    int? i = null;
    int j = 10;


    if (i < j)
        Console.WriteLine("i < j");
    else if( i > 10)
        Console.WriteLine("i > j");
    else if( i == 10)
        Console.WriteLine("i == j");
    else
        Console.WriteLine("無(wú)法比較");
}
輸出:
無(wú)法比較

Nullable靜態(tài)類是Nullable類型的輔助類。它提供了比較可空類型的比較方法。它還具有GetUnderlyingType方法,該方法返回可為null的類型的基礎(chǔ)類型參數(shù)。

static void Main(string[] args)
{
    int? i = null;
    int j = 10;

    if (Nullable.Compare<int>(i, j) < 0)
        Console.WriteLine("i < j");
    else if (Nullable.Compare<int>(i, j) > 0)
        Console.WriteLine("i > j");
    else
        Console.WriteLine("i = j");
}
輸出:
i < j

可空類型的特性

  1. 可空類型只能與值類型一起使用。

  2. 如果 Value 為 null,則 Value 屬性將拋出 InvalidOperationException; 否則將返回值。

  3. 如果變量包含值,則HasValue屬性返回true;如果為null,則返回false。

  4. 只能將 == 和!= 運(yùn)算符與可為空的類型一起使用。對(duì)于其他比較,請(qǐng)使用Nullable靜態(tài)類。

  5. 不允許使用嵌套的可空類型。Nullable <Nullable <int >> i; 將給出編譯時(shí)錯(cuò)誤。

 要記住的要點(diǎn)

  1. Nullable <T>類型允許將null分配給值類型。

  2. 運(yùn)算符是Nullable類型的簡(jiǎn)寫語(yǔ)法。

  3. 使用value屬性獲取可空類型的值。

  4. 使用HasValue屬性檢查是否將值分配給空類型

  5. 靜態(tài) Nullable 類是一個(gè)幫助器類,用于比較可空類型。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清