• 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是可以包括structenum在内的任何值类型,但是不能是引用类型,也不能是可空类型;从这里我们可以看出,可能类型不能嵌套使用。

    在可空类型中,它包含以下实例成员:

    首先是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="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、总结

    最后想说说,可空类型在日常的项目中还是会经常使用到,针对每个逻辑层的方法对于传入参数和返回参数而言,都可能存在使用可空类型来进行处理和转化。

    有不对的地方请大家指正或者一起交流。

  • 相关阅读:
    2491 玉蟾宫
    1704 卡片游戏
    1020 孪生蜘蛛
    1215 迷宫
    3149 爱改名的小融 2
    1316 文化之旅 2012年NOIP全国联赛普及组
    1664 清凉冷水
    157. [USACO Nov07] 奶牛跨栏
    [SCOI2005]繁忙的都市
    【NOIP2014模拟赛No.1】我要的幸福
  • 原文地址:https://www.cnblogs.com/aixiaojun/p/12420272.html
Copyright © 2020-2023  润新知