详细了解 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;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析