C# 可空类型的具体使用

 更新时间:2020年6月25日 10:35  点击:1797

在项目中我们经常会遇到可为空类型,那么到底什么是可为空类型呢?下面我们将从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# 可空类型内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25