详细了解 int? 类型
一、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? 类型的更多相关文章
- asp.net MVC Model 类的主键 int类型、string类型、GUID类型。
在使用asp.net mvc进行定义 模型类的时候,一般情况下,我们都会定义一个属性为 int iD{get;set;} 或为int ClassNameID {get;set;},在这种情况下 1.I ...
- getchar返回int类型
#include <stdio.h> /* copy input to output; 2nd version */main(){int c;c = getchar();while(c ! ...
- 详解mysql int类型的长度值问题【转】
mysql在建表的时候int类型后的长度代表什么? 是该列允许存储值的最大宽度吗? 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道int(1),这个长度1并不代表允 ...
- MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题
MySQL 数据类型中的 integer types 有点奇怪.你可能会见到诸如:int(3).int(4).int(8) 之类的 int 数据类型.刚接触 MySQL 的时候,我还以为 int(3) ...
- MySQL中int类型的字段使用like查询方法
方法参考自: http://stackoverflow.com/questions/8422455/performing-a-like-comparison-on-an-int-field 也就是使用 ...
- int类型究竟占几个字节
我最近也在看深入理解计算机系统这本书,上面提到了在32位机器和64机器中int类型都占用4个字节.后来,别人查了The C Programming language这本书,里面有一句话是这样的: Ea ...
- long l=88;这个表达式是正确的,因为long比int类型大,会发生自动转换
long l=88;这个表达式是正确的,因为long比int类型大,会发生自动转换
- 使用DataOutputStream写入int类型数字不能显示
前段时间做Android系统项目需要使用DataOutputStream数据流向文件里写入数据,写入的有String类型和int类型.写入之后在代码中使用DataInputStream读出是没有问题的 ...
- Android java传递int类型数组给C
接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ...
随机推荐
- cocoapods 删除已导入项目的第三方库和移除项目中的cocoapods
第一部分将介绍如何删除项目中已经由cocoapods配置好的第三方 1.打开项目中的Podfile文件 2.删除选中的pod Snapkit的命令行3.打开终端cd到当前项目的根目录下重新执行pod ...
- 深入理解 JavaScript 异步系列(2)—— jquery的解决方案
第一部分,jQuery-1.5 之后的 ajax 本地址http://www.cnblogs.com/wangfupeng1988/p/6515779.html未经允许不得转载~ $.ajax这个函数 ...
- maven构建maven-project和maven-module
在Eclipse中创建Maven多模块工程的例子 更多0 如果,你需要创建多个项目,项目之间即独立又有关系,那么创建一个Maven多模块项目是个非常好的选择,也非常cool!怎么在Eclipse里 ...
- shell笔记整理1---vim编译器基础应用(参考鸟哥)
1.linux中的配置文件都已是以ASCII的纯文本的形式存在 2.vim文本编译器. 一般模式:用vi打开的一个文件直接进入的就是一般模式,这个模式可以移动光标和删除字符,复制粘贴等,但是不能比那几 ...
- 腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化
作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作 ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- 1692: [Usaco2007 Dec]队列变换(BZOJ1640强化版)
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 682 Solved: 280[Submit][Sta ...
- cassandra简单介绍与基本操作
项目中用到了cassandra,用来存储海量数据,且要有高效的查询:本博客就进行简单的介绍和进行一些基本的操作 一.使用场景: 是一款分布式的结构化数据存储方案(NoSql数据库),存储结构比Key- ...
- CRUD操作(20161017)
上午: (7)范围查询 select * from car where price>40 and price<60 select * from car where price betwee ...
- TypeScript设计模式之解释器
看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...