可空类型是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. 简述 CGI、FastCGI和php-FPM的区别

    1.CGI是联系webserver 跟php解析器的一个桥梁 2.FastCGI是CGI改良的版本 3.php-FPM 是FastCGI 的进程管理器

  2. WiredTiger 4.1.0 发布,MongoDB 存储引擎

    WiredTiger 4.1.0 发布了.WiredTiger 是一个开源的.高性能.可伸缩的 MongoDB 数据存储引擎. 下面是一些性能比较图表: 该版本暂未提供更新内容. 下载地址: Sour ...

  3. 关于java中的值传递和引用传递(也就是地址传递)

    概念解释: 值传递,传递值,在函数中形参发生的变化不影响实参. 引用传递,传递对象引用,在函数中形参发生的变化影响实参. ======================================= ...

  4. 利用webuploader实现超大文件分片上传、断点续传

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  5. Python多线程笔记(三),queue模块

    尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信 que ...

  6. 点击按钮切换内容效果(使用CSS DIV与JavaScript)

    <head><script type="text/javascript">function change_div(id){  if (id == 'gsyw ...

  7. Centos 如何扩充/增加磁盘

    1:使用背景 废话不多说,磁盘空间不足,增加磁盘,然后扩充现有不足空间磁盘. 本次以Vmware进行测验. 2:我们本次要增加的就是这个 3:我们先添加一个磁盘,20G,添加过程不在赘述 4:添加完成 ...

  8. jquery入门使用

    目录 jquery入门使用 1.jQuery简介 jQuery介绍 jQuery优点 2.jQuery的load方法 load方法介绍 load实例 代码 3.jQuery的get方法 get()方法 ...

  9. redis基准性能测试

    1 测试目的 了解redis在不同情况下的性能表现,并分析其性能瓶颈,找出相应的解决方案. 2 redis基准测试概览 运行下列命令可以了解自己的redis服务器的基本性能指标. 通过loopback ...

  10. PHP 之源代码加密与解密,加密后可直接运行

    方式一: <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/10/16 * Time: 10:25 */ class Enci ...