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。

如果将可空类型转换为其基础类型,需要使用强制转换或其Value属性获取:

int myInt = (int)myNullableInt;
int myInt = myNullableInt.Value;
//以上两种方式,在可空类型实例为null时会抛出异常,可以使用以下方式代替
int myInt = myNullableInt.GetValueOrDefault(); //其重载方法可以传入默认值

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

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

到此这篇关于C# 可空类型的具体使用的文章就介绍到这了,更多相关C# 可空类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# 可空类型分析

    例如,Nullable<Int32>,读作"可空的 Int32",可以被赋值为 -2147483648 到 2147483647 之间的任意值,也可以被赋值为 null 值.Nullable<bool> 可以被赋值为 true 或 false,或 null.在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用.例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义. 可空类型具有

  • C#中关于可空类型的小知识

    1) 在与1元或二元运算符一起使用时,如果其中一个操作数为null或两个均null,则结果为null. 如: 复制代码 代码如下: int? a = null; int? b = a+3; 则b为null 2) 比较可空类型时,只要有一个操作数为null,结果就为false 如: 复制代码 代码如下: int? a = null; int? b = 8; (a>=b)将返回false 而正是因为null的可能性,所以不能随意比较一个可空类型和一个非可空类型. 3) 空接合运算符 空接合运算符&quo

  • C#基础知识 全面解析可空类型

    引言: C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容(最近一直都在思考如何来分享这篇文章的,因为刚开始觉得可空类型使用过程中比较简单,觉得没有讲的必要,但是考虑到这个系列的完整性,决定还是唠叨下吧,希望对一些不熟悉的人有帮助). 一.为什么会有可空类型 如果朋友们看了我之前的分享,对于这一部分都不会陌生,因为我一般介绍C#特性经常会以这样的方式开头的, 因为每个特性都是有它出现的原因的(有一句佛

  • c#可空类型的作用说明

    可空类型用途主要是从数据库读取数据有可能为空,而不是插入使用,插入数据都要进行验证,如果要插入数据库的null,则使用DBNull.value 判断取出的数据是否为数据库中的null,如果是则赋值给可空的datetime类型的Lockdatatime 属性 tseat.Lockdatatime = reader.IsDBNull(5) ? null : (DateTime?)reader.GetDateTime(5); 判断取出的数据是否为数据库中的null,如果是则赋值给可空的int类型的Te

  • C#基础语法:可空类型详解

    以下是System.Nullable<T>在FCL中的定义. [Serializable, StructLayout(LayoutKind.Sequential)] public struct Nullable<T> where T :struct { private Boolean hasValue= false; internal T value= default(T); public Nullable(T value) { this.value= value; this.ha

  • C#难点逐个击破(8):可空类型System.Nullable

    null与void null值用来表示数据类型未被赋予任何值,它是一种引用类型:void表示没有类型,或者说是没有任何值.null与void的区别可以认为void是根本没有,而null是一个空箱子,里面什么都没有. null值只能赋值给引用类型,这里注意到string也是一种引用类型:引用类型在C中称为"指针",即存放变量位置的内存空间位置.将变量设为null,会显式地设置引用,且它本身不指向任何内存位置: null值赋给值类型将导致编译错误. void用于方法值的返回,其本质并不是一

  • C#可空类型用法分析

    本文实例讲述了C#可空类型用法.分享给大家供大家参考.具体分析如下: 可空类型只能用于值类型,不能用于引用类型,引用类型本身支持null值. 如果直接把null赋值给int类型,会出现一个错误"无法将 NULL 转换成'int',因为它是一种值类型". 赋值时应该使用 int? a = null; 可空类型与一元或二元运算符一起使用是,如果一个操作数或两个操作数都是null,其结果为null. 说白了int?a=null 这句话的意思就是让值类型a可以接收null这个值 举例1 int

  • Java8中Optional类型和Kotlin中可空类型的使用对比

    本文主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 在 Java 8中,我们可以使用 Optional 类型来表达可空的类型. package com.easy.kotlin; import java.util.Optional; import static java.lang.System.out; /** * Optional.ofNullable - 允许传递为 null 参数 *

  • C# 可空类型的具体使用

    在项目中我们经常会遇到可为空类型,那么到底什么是可为空类型呢?下面我们将从4个方面为大家剖析. 1.可空类型基础知识 顾名思义,可空类型指的就是某个对象类型可以为空,同时也是System.Nullable结构的实例.可空类型可以表示基础值类型正常范围的值,然后再加上一次null值.当然,也可以被赋值null值.比如Nullable<bool>可以被赋值true.false或者null. 声明一个可空类型的标准语句如下: T? myNullableNum = rangedNum/new T?()

  • 详解c# 可空类型(Nullable)

    C# 单问号 ? 与 双问号 ?? ? : 单问号用于对 int,double,bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 NullAble 类型的. int? i = 3 等同于 Nullable<int> i = new Nullable<int>(3); int i; //默认值0 int? ii; //默认值null ?? : 双问号 可用于判断一个变量在为 null 时返回一个指定的值. 接下来我们详细说明. C# 可空类

随机推荐