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是可以包括struct
和enum
在内的任何值类型,但是不能是引用类型,也不能是可空类型;从这里我们可以看出,可能类型不能嵌套使用。
在可空类型中,它包含以下实例成员:
首先是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、总结
最后想说说,可空类型在日常的项目中还是会经常使用到,针对每个逻辑层的方法对于传入参数和返回参数而言,都可能存在使用可空类型来进行处理和转化。
上一篇:asp.net页面与页面之间传参数值方法(post传值和get传值)
栏 目:.NET代码
下一篇:Asp.net之TextBox只允许输入数字的方法总结
本文标题:C# 可空类型的具体使用
本文地址:http://www.codeinn.net/misctech/193861.html