一、int?是什么

二、了解Nullable结构体

三、Nullable类型的取值与转换

1.GetValueOrDefault

2.运算符重载


一、int?是什么

说到int?,或者double?,平时只是在接收数据库传来的可空值类型数据时用用。

但int既然是值类型,不能为空,为什么int?就可空了呢,引用类型才是可空的,难道int?是引用类型?

测试一下吧:

1. 写一句int?=3,看看反编译结果

2. 编译结果里有关键字new,我们也new一个试试

结果发现int?有两个重载

重载1:

重载2:

重载2包含一个int型参数,并解释说会实例化一个Nullable<T>结构体


3. 手动实例化Nullable<T>

发现Nullable<int> test=new Nullable<int>(1);这样的写法是可行的

下面是三种不同的写法及其反编译代码:

可见,这三种写法是等价的。


二、了解Nullable结构体

Nullable结构体长这样:

但既然int? 是Nullable结构体的特例,为什么就可以赋值为null呢?

模仿上面的Nullable自己封装一个Nullable1并使用,看看效果

结果是Nullable可以赋值为null,自己写的Nullable1却不可以,而且Nullable与Nullable1两个类型的颜色还有点深浅的区别,很奇怪

把错误的代码屏蔽,反编译看看IL代码,Nullable<int> e=null;对应的是这样的

把Nullable<int> e=null; 改为Nullable<int> e=1;再看看结果:

再找一个引用类型并赋值为null,比如string s=null; 的IL代码为:

可见对于Nullable<int> e=null;来说,null对应的IL码为initobj;而对于string s=null来说null对应的IL码则是idnull,这两个地方的null是不同的

但我们不是也可以用e==null这样的写法吗,难道这儿的null也是特殊的用法

继续测试代码,结果为true

反编译

原来这儿的d==null相当于!d.HasValue

HasValue属于Nullable结构体的成员

对这一系列现象不清楚了,可能Nullable<int> e=null中的null用来特指Nullable结构体中Value为空时的状态吧,恳请大神指教


三、Nullable类型的取值与转换

最后再试试Nullable结构体中的两个GetValueOrDefault方法以及两个运算符重载

1. GetValueOrDefault

对于为空的变量,GetValueOrDefault()会返回0;GetValueOrDefault(T defaultValue)则会返回指定的defaultValue的值。

另外,c# 7.0的新语法“??”与这个方法有相同的作用

2.运算符重载

显式运算符重载:

隐式运算符重载:

显式重载的参数为可空值类型,返回结果为Nullable结构体的Value属性;

隐式重载的参数为普通值类型,返回结果为一个Nullable结构体,同时其Value属性已经被赋值

比如,有两个参数a、b

int a;

int? b=0;

将b赋值给a,会使用显式重载,要写成a = (int)b;

而将a赋值给b,则会使用隐式重载,可直接b = a;

详细了解 int? 类型的更多相关文章

  1. asp.net MVC Model 类的主键 int类型、string类型、GUID类型。

    在使用asp.net mvc进行定义 模型类的时候,一般情况下,我们都会定义一个属性为 int iD{get;set;} 或为int ClassNameID {get;set;},在这种情况下 1.I ...

  2. getchar返回int类型

    #include <stdio.h> /* copy input to output; 2nd version */main(){int c;c = getchar();while(c ! ...

  3. 详解mysql int类型的长度值问题【转】

    mysql在建表的时候int类型后的长度代表什么? 是该列允许存储值的最大宽度吗? 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道int(1),这个长度1并不代表允 ...

  4. MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题

    MySQL 数据类型中的 integer types 有点奇怪.你可能会见到诸如:int(3).int(4).int(8) 之类的 int 数据类型.刚接触 MySQL 的时候,我还以为 int(3) ...

  5. MySQL中int类型的字段使用like查询方法

    方法参考自: http://stackoverflow.com/questions/8422455/performing-a-like-comparison-on-an-int-field 也就是使用 ...

  6. int类型究竟占几个字节

    我最近也在看深入理解计算机系统这本书,上面提到了在32位机器和64机器中int类型都占用4个字节.后来,别人查了The C Programming language这本书,里面有一句话是这样的: Ea ...

  7. long l=88;这个表达式是正确的,因为long比int类型大,会发生自动转换

    long l=88;这个表达式是正确的,因为long比int类型大,会发生自动转换

  8. 使用DataOutputStream写入int类型数字不能显示

    前段时间做Android系统项目需要使用DataOutputStream数据流向文件里写入数据,写入的有String类型和int类型.写入之后在代码中使用DataInputStream读出是没有问题的 ...

  9. Android java传递int类型数组给C

    接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ...

随机推荐

  1. Hibernate 迫切连接和普通连接的区别

    package com.baidu.test; import java.util.ArrayList;import java.util.LinkedHashSet;import java.util.L ...

  2. 2017 3-4/5 两天的学习的REVIEW

    明天就要去面试啦,去感受一下,估计又是一顿虐,蓝瘦-- 3月4日:计算机安全基础技术与原理方面的学习 密码体制(密码)由五个部分组成: 消息空间(m),密文空间(c),密钥空间(k),加密算法(E), ...

  3. 关于Xmanager使用问题的总结

    做大数据的人对Xmanager这类远程连接工具应该都不陌生,我在使用Xmanager时遇到了一些问题并经过google和亲测解决,写在这里与大家分享. 1. [问题描述] 在windows上使用Xma ...

  4. Eclipse打JAR包的使用

    编译Java代码你当然可以直接使用Javac,但对于大多同学还是使用Eclipse编辑器来得快捷.这篇文章来说说我使用Eclipse编译后的执行之路,走路许多弯路,看我一一道来. 演示系统的架构 首先 ...

  5. oracle lag与lead分析函数简介

    lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数我们可以取到当前行列的偏移N行列的值 lag可以看着是正的向上的偏移 lead可以认为负的向下的偏移 具体我们来看几个例子: 我们先看下 ...

  6. Java基础——运算符

    一.赋值运算符 在前面的学习中,用到最多的是什么呢?就是“=” .例如:int money=1000;   //储存本金 使用“=”将数值1000放入变量money的存储空间中.“=”称为赋值运算符. ...

  7. Visual Studio 2017 ASP.NET Core开发

    Visual Studio 2017 ASP.NET Core开发,Visual Studio 2017 已经内置ASP.NET Core 开发工具. 在选择.NET Core 功能安装以后就可以进行 ...

  8. Java设计模式之职责型模式总结

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6548127.html 所谓职责型模式,就是采用各种模式来分配各个类的职责. 职责型模式包括 ...

  9. python 接口自动化测试--框架定型(六)

    脚本执行步骤: 1.还原测试数据库: 2.读取接口用例CSV文件到数据库: 3.执行数据库中标记执行的用例: 4.对比预期结果,将测试结果写入数据库结果表中. 数据管理: 事先备份测试数据库,并搭建自 ...

  10. js提交表单错误:document.form.submit() is not a function

    今天在写JS时,遇上这么个错误:"document.form.submit() is not a function",经过一番搜索,最终找到了修复方法. 这个错误一般是由于表单&l ...