C#可空類型知多少

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

一、可空類型基礎知識

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

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

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

好比,咱們聲明一個可空值類型並賦值null;post

int? intClass = null;

或者使用ui

int? intClass = new int?()

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

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

從聲明中能夠看出,它的基礎類型T是能夠包括structenum在內的任何值類型,可是不能是引用類型,也不能是可空類型;從這裏咱們能夠看出,可能類型不能嵌套使用。code

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

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

二、可空類型的使用

在可空類型中,常見的有使用單問號?和雙問號??來進行設置。其中?經常使用於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();
        }
    }
}

三、可空類型的案例使用

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

頁面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 });
        }
    }
}
四、總結

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

有不對的地方請你們指正或者一塊兒交流。

 

 

出處:https://www.cnblogs.com/aixiaojun/p/12420272.html

相關文章
相關標籤/搜索