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