可空类型是System.Nullable结构体的实列。一个可空类型代表了相应值类型的正确范围附加null值。这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确。

那我就来说说这可空类型吧,上次说到了值类型与引用类型,其中就说到了,值类型是不能为空的,int i=null是错的,值类型为能为空,但我们有时候需要让值类型也可以为空,怎么办呢,那就在值类型的值的范围上扩充一个null值。

  1. 为什么要有可空类型

我们在日常开发中,什么地方需要让值类型也变成可空呢?如果你有试过把数据库内的数据对象化的时候,面对数据库中的字段定义如:

要转化成对象

隐藏行号 复制代码 ?
  1. public class XXXX 
  2. { 
  3.     public int id { get; set; } 
  4.     //…… 
  5.  
  6. } 

这时候就出现问题了,在数据库中是允许为空的,但是在类设计的时候,int类型就是不允许为空的,你不给它赋值,它也是有默认值0的。怎么办?这与数据库的设计是有冲突的,于是,就必须使用咱们的可空类型,我个人理解这也就是为什么要有可空类型的原因。

  • 怎么表示可空类型

使用可空类型,上面的类就可以写成

隐藏行号 复制代码 ?
  1. public class XXXX 
  2. { 
  3.     public int? id { get; set; } 
  4.     //…… 
  5.  
  6. } 

没看错,就是在int后面加上?号,这就是可空类型的表示,当然还有其它的表示方式

 
  1. Nullable<int> d = null; 

这两种表示方式其实是等效的,就根据喜好和使用场景灵活使用就行。

  • 怎么判断是null还是其它值
  • 对于可空类型,我们可以很简单地使用null与可空类型进行比较,就可能判断变量的值是否为null。如:
    隐藏行号 复制代码 ?这是一段程序代码。
    1. Nullable<int> d = null; 
    2. bool isNull = d == null ? true : false;  
  • 当然,我还有其它的办法与方法来做这同样效果的事,如:
    隐藏行号 复制代码 ?这是一段程序代码。
    1. Nullable<int> d = null; 
    2. bool isNull = !d.HasValue;  
  • 注意,如果HasValue是为false时,使用 var result=d.Value时,会抛出异常System.InvalidOperationException
  • 根据情况,根据需要,灵活使用以上两种判断方法。
  • 可空类型怎么给值类型赋值
  • 可空类型不可以直接转化成值类型,也不可以直接对值类型赋值,如:
    隐藏行号 复制代码 ?这是一段程序代码。
    1. Nullable<int> d = null; 
    2. int result = d;//错  
    3. int result = (int)d;//错 

    那怎么做呢,最简单的办法就是

    隐藏行号 复制代码 ?这是一段程序代码。
    1. Nullable<int> d = null; 
    2. int result = d.GetValueOrDefault(); 

    这时result的值为0;

    或者也可以判断是否为空,对它进行赋值

    隐藏行号 复制代码 ?这是一段程序代码。
    1. Nullable<int> d = null; 
    2. int result; 
    3. if (!d.HasValue) 
    4. { 
    5.     result = d.Value; 
    6. } 

    如果可空类型是经过运算给值类型赋值。那就还有一种办法

    隐藏行号 复制代码 ?这是一段程序代码。
    1. Nullable<int> d = null; 
    2. int result = d ?? +1;  

    即使用??进行转意。这是的result的值为1;

  • 反射中的可空类型
  • 我们经常会在反射中使用的可空类型,那怎么来使用可空类型呢?
    隐藏行号 复制代码 ?这是一段程序代码。
    1. public class NullableTest 
    2. { 
    3.     public int? ID { get; set; } 
    4. } 
隐藏行号 复制代码 ?这是一段程序代码。
  1. var propertyInfo= typeof(NullableTest).GetProperty("ID"); 

查询变量的值时,我们会发现

propertyInfo.PropertyType.Name Nullable`1
propertyInfo.PropertyType.IsGenericType true
propertyInfo.PropertyType.IsGenericTypeDefinition false
propertyInfo.PropertyType.GetGenericTypeDefinition().Name Nullable`1

我们根本无法使用一般泛型得到泛型基类型的方法GetGenericTypeDefinition()得到可空类型的基类型,此时,我们就需要使用GetGenericArguments()去得到泛型的基础类型。

隐藏行号 复制代码 ?这是一段程序代码。
  1. var propertyInfo = typeof(NullableTest).GetProperty("ID"); 
  2. if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) 
  3. { 
  4.     Type[] typeArray = propertyInfo.PropertyType.GetGenericArguments(); 
  5.     Type baseType = typeArray[0]; 
  6. } 

做到这里,我们就可以使用反射来完成任何我们想要的操作了。

细说可空类型 nullable PropertyType的更多相关文章

  1. 【转】四、可空类型Nullable<T>到底是什么鬼

    [转]四.可空类型Nullable<T>到底是什么鬼 值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类 ...

  2. 四、可空类型Nullable<T>到底是什么鬼

    值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类型变量都是保存一个对象的地址引用(就像一个url对应一个页面),而 ...

  3. 【C#】可空类型(Nullable)

    C# 可空类型(Nullable) C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值. 例如,Nullable& ...

  4. 可空类型 Nullable<T>

    Nullable<T> 内部实现了显示和隐式转换 显示转换: public static explicit operator T(T? value) { return value.Valu ...

  5. 【C#】可空类型 NullAble<T>

    在实际编写代码时候 ,  会遇到很多场景, 需要将值置成空, 比如发货日期, 有可能是没有. 在没有可空类型之前, 程序都是用 魔值, 即为一个minValue或者常量, 来代表这个值为空, 也有用一 ...

  6. 可空类型Nullable

    Nullable类型: 值类型变量默认为0,不可空,为了使它可空,出现了Nullable类型,类型前面加?  变为引用类型 值类型是没有null值的,比如int,DateTime,它们都有默认值.举个 ...

  7. 雷林鹏分享:C# 可空类型(Nullable)

    C# 可空类型(Nullable) C# 可空类型(Nullable) C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 nu ...

  8. C#2.0之可空类型

    可空类型Nullable<T> 在C#2.0之前 ,值类型一直不可以为null,但是实际开发中常常会有这样的需求,比如结束时间. 为什么不可以为null 对于引用类型来说,null代表着空 ...

  9. C# Nullable可空类型

    一个Nullable类型就是基本类型加上一个"是否为null指示器"的合成类型.对于一个类型,如果既可以给他分配一个值,也可以给它分配null引用,我们就说这个类型是可空的. 可空 ...

随机推荐

  1. 在 windows 上安装 git 2.22

    下载 by win 下载地址:https://git-scm.com/download/win 如下图.选择对应的版本下载: 安装 by win 1.双击下载好的git安装包.弹出提示框.如下图: 2 ...

  2. 为 32 位单片机设计的脚本语言 Berry

    Berry是一款一款为32位单片机设计的脚本语言.Berry解释器使用C89标准实现,该语言可以在RAM或ROM很小的设备上运行. 尽管Berry的体积很小,但是它也支持class以及闭包等功能,使得 ...

  3. 13 Vue事件处理

    监听事件 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码. 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码. 示例: ...

  4. Fiddler抓包工具(捕获Android数据包)

    一:获取Android的数据包必须要在同一个网络中 移动设备访问网络原理 先看看移动设备是怎么去访问网络,如图所示,可以看到,移动端的数据包是从wifi出去的. 可以看得出,移动端的数据包,都是要走w ...

  5. 使用JSP/Servlet技术开发新闻发布系统---JSP数据交互(二)

    JSP内置对象application application对象 JSP常用的内置对象 对象的作用域 作用的分类 对象的作用域 page作用域 实例 //页面1 <% String name = ...

  6. 十九.部署LNMP环境、构建LNMP平台、地址重写

    proxy client web1 web2   1.部署LNMP环境 1.1 部署nginx(前面已部署过) 1.2 部署mariadb ]# yum -y install mariadb mari ...

  7. b/s利用webuploader实现超大文件分片上传、断点续传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  8. 工作流学习之--PHP工作流插件

    一.支持的PHP的工作流插件有: 1. TPFlow(thinkphp work flow):是一款开源的ThinkPHP工作流插件,用来解决OA.ERP.CRM.CMS等等办公软件的审核审批的问题. ...

  9. Codeforces Round #574 (Div. 2)

    目录 Contest Info Solutions A. Drinks Choosing B. Sport Mafia C. Basketball Exercise D1. Submarine in ...

  10. Java Heap dump文件分析工具jhat简介

    jhat 是Java堆分析工具(Java heap Analyzes Tool). 在JDK6u7之后成为标配. 使用该命令需要有一定的Java开发经验,官方不对此工具提供技术支持和客户服务. 用法: ...