C#可空類型知多少

在項目中我們經常會遇到可爲空類型,那麼到底什麼是可爲空類型呢?下面我們將從4個方面爲大家剖析。

1、可空類型基礎知識

顧名思義,可空類型指的就是某個對象類型可以爲空,同時也是System.Nullable結構的實例。可空類型可以表示基礎值類型正常範圍的值,然後再加上一次null值。當然,也可以被賦值null值。比如Nullable<bool>可以被賦值true、false或者null。

聲明一個可空類型的標準語句如下:

T? myNullableNum = rangedNum/new T?() or null;

比如,我們聲明一個可空值類型並賦值null;

int? intClass = null;

或者使用

int? intClass = new int?()

同時,我們都知道,可空類型是泛型Nullable<T>的實例,聲明如下:

Nullable<int> myNullableClass = new Nullable<int>();

從聲明中可以看出,它的基礎類型T是可以包括struct和enum在內的任何值類型,但是不能是引用類型,也不能是可空類型;從這裏我們可以看出,可能類型不能嵌套使用。

在可空類型中,它包含以下實例成員:

首先是HasValue,它是隻讀屬性,用於判斷對象是否有值。如果當前值爲空,則返回true,否則返回flase;其次是Value,它也是隻讀屬性,用於獲取對象的值。如果當前值非空,則可以正常獲取到對應的值,否則會拋出異常InvalidOperationException;接着是GetValueOrDefault()的實例方法。該方法通過HasValue和Value屬性來得到當前的信息。如果當前值非空,即HasValue是true,則返回Value的值;否則返回T類型的默認值,即私有字段value的默認值。最後一個是GetValueOrDefault()實例方法。該方法依然是通過HasValue和Value屬性來得到當前的信息。如果當前值非空,即HasValue是true,則返回Value的值,否則返回默認值defaultValue。

2、可空類型的使用

在可空類型中,常見的有使用單問號?和雙問號??來進行設置。其中?常用於int,double,bool等無法直接賦值爲null的數據類型;所代表的含義是這個數據類型是Nullable類型。

int? k=10;

等同於

Nullable<int> k = new Nullable<int>(10);

int m; //默認值爲0

int? m; //默認值爲null

而??主要用於在判斷對象的值爲null時所返回的指定的值。

int? num = null;

var k == num ?? 9;

對於可空類型,屬於一種特殊的數據類型,它可表示所對應的基礎值類型中正常範圍內的值,再加上一個null值。

比如說一個int類型的對象,它可以被賦值爲-2,147,483,648到2,147,483,647之間的任意值,也可以被賦值爲null值。而對於一個bool類型的值來說,它可以是true、false也可以是null。

聲明一個nullable類型(可控類型)的語法如下:

<data_type>?<variable_name> = null;

以下示例說明:

using System;

namespace ExampleTest

{

class Program

{

    static void Main(string[] args)

    {

        int? objectNull = null;

        int? k = 80;

        double? db1 = new double?();

        double? db2 = 4.56;

        bool? b = new bool?();

        Console.WriteLine($"顯示可空類型{objectNull},{k},{db1},{db2}");

        Console.WriteLine($"一個可空的布爾值:{b}");

        Console.ReadLine();

    }

}

}

而對於??的合併運算符,它主要用於定義可空類型和引用類型的默認值。在其運算過程中,爲類型轉換定義了一個預設值,防止可空類型的值是null。

using System;

namespace ExampleTest

{

class Program

{

    static void Main(string[] args)

    {

        double? objNull = null;

        double? k = 4.85;

        double db;

        db = objNull ?? 9.82;

        Console.WriteLine($"num3的值:{db}");

        db = k ?? 6.02;

        Console.WriteLine($"num3的值:{db}");

        Console.ReadLine();

    }

}

}

3、可空類型的案例使用

通過一個簡單的前端查詢功能來看看可空類型的使用。

頁面html

<div>

姓名:<input id="Name" name="Name" style="width:60px" />

性別:<select id="Kum" name="Kum">

    <option value="0">--請選擇--</option>

    <option value="1">男</option>

    <option value="2">女</option>

</select>

</div>

傳入參數Dto

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

namespace WebTest.Models

{

public class TestInDto

{

    /// <summary>

    /// 隔離點

    /// </summary>

    public int? Kum { get; set; }

    /// <summary>

    /// 姓名

    /// </summary>

    public string Name { get; set; }

}

}

控制器

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;

using WebTest.Models;

namespace WebTest.Controllers

{

public class TestController : Controller

{

    // GET: Test

    public ActionResult Index()

    {

        return View();

    }

    public ActionResult TestFunction(TestInDto testInDto)

    {

        if (!testInDto.Kum.HasValue)

            return Json(new { Success = false, Message = "請選擇性別", Data = "" });

        int? num = null;

        DateTime? dt = null;

        bool? b = null;

        var data = new TestOutDto

        {

            Name = testInDto.Name,

            Num = num ?? 10,

            Dt = dt ?? DateTime.Now,

            IsExist = b ?? false

        };

        return Json(new { Success = true, Message = "", Data = data });

    }

}

}

4、總結

最後想說說,可空類型在日常的項目中還是會經常使用到,針對每個邏輯層的方法對於傳入參數和返回參數而言,都可能存在使用可空類型來進行處理和轉化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章