在项目中我们经常会遇到可为空类型, 那么到底什么是可为空类型呢? 下面我们将从 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 是可以包括 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<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, 总结
最后想说说, 可空类型在日常的项目中还是会经常使用到, 针对每个逻辑层的方法对于传入参数和返回参数而言, 都可能存在使用可空类型来进行处理和转化.
有不对的地方请大家指正或者一起交流.
来源: https://www.cnblogs.com/aixiaojun/p/12420272.html