博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详细了解 int? 类型
阅读量:4619 次
发布时间:2019-06-09

本文共 1474 字,大约阅读时间需要 4 分钟。

一、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;

 

转载于:https://www.cnblogs.com/zhixin9001/p/6705412.html

你可能感兴趣的文章
poj 1753 Flip Game
查看>>
在深信服实习是怎样的体验(研发测试岗)
查看>>
Linux免密码登陆
查看>>
SpringMVC中文件的上传(上传到服务器)和下载问题(二)--------下载
查看>>
Socket & TCP &HTTP
查看>>
osip及eXosip的编译方法
查看>>
Hibernate composite key
查看>>
[CF Round #294 div2] D. A and B and Interesting Substrings 【Map】
查看>>
keepalived+nginx安装配置
查看>>
我的2015---找寻真实的自己
查看>>
android编译遇到问题修改
查看>>
解决Ubuntu18.04.2远程桌面Xrdp登录蓝屏问题
查看>>
Git的安装和使用教程详解
查看>>
lsof命令详解
查看>>
常用模块,异常处理
查看>>
父窗口与子窗口之间的传值
查看>>
eclipse 找不到 tomcat 的解决方案
查看>>
HDU 1890--Robotic Sort(Splay Tree)
查看>>
connection string for Excel/Access 2010
查看>>
【转】【Python】Python中的__init__.py与模块导入(from import 找不到模块的问题)
查看>>