什么是可为空类型?
admin
2023-03-25 07:41:36
0

在项目中我们经常会遇到可为空类型,那么到底什么是可为空类型呢?下面我们将从4个方面为大家剖析。

1、可空类型基础知识

顾名思义,可空类型指的就是某个对象类型可以为空,同时也是System.Nullable结构的实例。可空类型可以表示基础值类型正常范围的值,然后再加上一次null值。当然,也可以被赋值null值。比如Nullable可以被赋值true、false或者null。

声明一个可空类型的标准语句如下:

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

比如,我们声明一个可空值类型并赋值null;

int? intClass = null;

或者使用

int? intClass = new int?()

同时,我们都知道,可空类型是泛型Nullable的实例,声明如下:

Nullable myNullableClass = new Nullable();

从声明中可以看出,它的基础类型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 k = new Nullable(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类型(可控类型)的语法如下:

? = 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

姓名:

性别:

传入参数Dto

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

namespace WebTest.Models

{

public class TestInDto

{

    /// 

    /// 隔离点

    /// 

    public int? Kum { get; set; }

    /// 

    /// 姓名

    /// 

    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、总结

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

相关内容

热门资讯

4款好用的苹果微信照片去水印小... 为了帮助苹果用户找到高效、安全的微信照片去水印工具,我们历时两周对20款主流微信小程序进行了深度测评...
【第一消息】“至尊宝牛牛到底有... 您好:至尊宝牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游...
今日重大消息“人人乐麻将有没有... 您好:人人乐麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游...
玩家攻略科普“天府棋牌有没有挂... 家人们!今天小编来为大家解答天府棋牌透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里买很...
玩家最新攻略“同城游比鸡到底是... 网上科普关于“同城游比鸡有没有挂”话题很是火热,小编也是针对同城游比鸡作*弊开挂的方法以及开挂对应的...
玩家最新攻略“微信链接牛牛有挂... 玩家最新攻略“微信链接牛牛有挂吗?”(详细开挂教程)您好,微信链接牛牛这个游戏其实有挂的,确实是有挂...
最新引进“乐斗小院是不是有挂?... 您好:乐斗小院这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游戏...
【第一财经】“天天爱海南麻将到... 有 亲,根据资深记者爆料天天爱海南麻将是可以开挂的,确实有挂(咨询软件无...
终于明白“边锋老友二打一到底有... 终于明白“边锋老友二打一到底有挂吗?”(太坑了果然有挂)您好,边锋老友二打一这个游戏其实有挂的,确实...
【第一财经】“发财麻将辅助器?... 有 亲,根据资深记者爆料发财麻将是可以开挂的,确实有挂(咨询软件无需打开...