登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
可为空的值类型(Nullable<T>)需要注意的地方 ...
可为空的值类型(Nullable<T>)需要注意的地方
[ 复制链接 ]
墨佳美
2025-5-29 15:36:40
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
值类型是不可以被赋值为null的,但有时候我们却需要简单的值类型被设置为null,比如一个查询界面上有很多的查询条件,查询条件可以使用也可以留空,这是从UI收集查询参数信息传递到后台执行查询的时候,我们如果约定某个参数为null时,就认为用户没有使用该查询参数。
第一,它是一个结构类型,值类型
其实下面的这个变量声明就是可为空的值类型
int? number = 100;
复制代码
但是number是真的值类型吗,我们使用typeof(int?)看看他的类型吧,
System.Nullable`1[System.Int32]
Nullable的声明如下:
public struct Nullable<T> where T : struct
复制代码
声明很清楚是Struct,这样我们就明白了,原来int?是值类型啊。
为了验证,我们使用number.GetType()来看看类型是什么,答案是System.Int32。
所以,能被赋值为null的,不一定是引用类型啊。(
注:CLR本身并不支持值类型被赋值为null,最多是将每个bit都设置为0。之所以现在能够被赋值为null,是因为编译器帮我们做了转换,使得C#语法支持了这种情况。这也是回复的网友说的语法糖(Syntactic sugar)
)
下面的代码在控制台中打印的结果是100,而不是101:
public void Test()
{
int? number = 100;
ChangeValue(number);
Console.WriteLine(number);
}
void ChangeValue(int? number)
{
number += 1;
}
复制代码
另外,大家看看下面这个代码行:
int? number = new Nullable<int>();
复制代码
number变量的值居然是null。
有的朋友会说Nullable是结构类型,所以装箱和拆箱是符合值类型特点的,我认为这句话是错误的。
比如:
object o = null;
int? a = (int?)o;
int b = (int)o;
复制代码
a是可以被拆箱为null值的,而b这行代码运行时是要抛出NullReferenceException异常的。
第二,Nullable可以转换为接口类型
本身Nullabe没有实现任何接口,但是请看下面的代码段:
Int32? n = 5;
Int32 result = ((IComparable) n).CompareTo(5); // Compiles & runs OK
Console.WriteLine(result); // 0
复制代码
这是CLR为开发人员提供的福利啊,呵呵。
如果没有这个福利的话,我们就写出下面的代码才能实现同样的过程:
Int32 result = ((IComparable) (Int32) n).CompareTo(5);
复制代码
复制代码
第三,??操作符
顺便提提这个??(null-coalescing operator)操作符,当操作符左边的表达式为空时,返回操作符右边的值;如果操作符左边表达式值不为空时,返回操作符左边表达式值。
??操作符给我们的编码带来了很多的便利,是我们的代码更为简练,可读性更强,看下面几个示例:
private static void NullCoalescingOperator() {
Int32? b = null;
// The line below is equivalent to:
// x = (b.HasValue) ? b.Value : 123
Int32 x = b ?? 123;
Console.WriteLine(x); // "123"
// The line below is equivalent to:
// String temp = GetFilename();
// filename = (temp != null) ? temp : "Untitled";
String filename = GetFilename() ?? "Untitled";
}
复制代码
还可以连写:
String s = SomeMethod1() ?? SomeMethod2() ?? "Untitled";
复制代码
还可以用在Lamda表达式里面,增强可读性:
Func<String> f = () => SomeMethod() ?? "Untitled";
复制代码
上面这些东西,希望对大家有用。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
可为
空的
类型
Nullable
lt
相关帖子
C++ std::forward<T> 的使用
数据类型-字典
深入浅出 Go slices 包:类型安全、内存安全与高性能实践
[项目开发经验分享]基于强类型事件的类型参数传递问题
TypedSql:在 C# 类型系统上实现一个 SQL 查询引擎
【URP】Unity[相机]渲染类型
详解Flask3.x版本下两大类型内存马
大疆不同任务类型执行逻辑,上云API源码分析
Flink学习笔记:状态类型和应用
原始类型与泛型对比笔记
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
C++ std::forward<T> 的使用
2
547
宋子
2025-10-19
业界
数据类型-字典
1
401
蔓好
2025-10-30
安全
深入浅出 Go slices 包:类型安全、内存安全与高性能实践
3
524
柴古香
2025-10-30
业界
[项目开发经验分享]基于强类型事件的类型参数传递问题
6
806
梦霉
2025-11-01
业界
TypedSql:在 C# 类型系统上实现一个 SQL 查询引擎
2
994
戈森莉
2025-11-24
安全
【URP】Unity[相机]渲染类型
2
53
忆雏闲
2025-11-24
业界
详解Flask3.x版本下两大类型内存马
3
1006
鞠彗云
2025-12-03
业界
大疆不同任务类型执行逻辑,上云API源码分析
0
80
迭婵椟
2025-12-12
业界
Flink学习笔记:状态类型和应用
0
175
茹静曼
2025-12-12
业界
原始类型与泛型对比笔记
0
769
晖顶蝇
2025-12-17
回复
(6)
寇油
2025-11-4 23:53:39
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
这个好,看起来很实用
滑清怡
2025-11-18 09:44:23
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
前排留名,哈哈哈
窝酴
2025-11-30 01:41:30
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
用心讨论,共获提升!
姬宜欣
2025-12-8 12:55:44
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢楼主提供!
骆贵
2025-12-12 05:51:04
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
过来提前占个楼
辈霖利
7 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
这个好,看起来很实用
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
墨佳美
7 天前
关注
0
粉丝关注
24
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994891
kk14977
6845357
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9982
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
967
[CSS+]HTML Learn Data Day 2
92
掌握相关性分析:读懂数据间的“悄悄话”
134
嵌入式UI框架-抗锯齿画圆弧算法
934
嵌入式UI框架的渐变原理、渐变算法
217
日本股票 API 对接实战指南(实时行情与 IP
558
解决Docker磁盘空间告急:认识并清理“悬空
393
别再只会算直线距离了!用“马氏距离”揪出
524
企业进行信息化后,一定会提高效率吗?真相
513
n8n整合ffmpeg
492
从random随机数看验证码重复数字
523
OceanBase 向量索引优化指南
232
Vue2中能否实现输入中文自动转化为拼音, 且
753
从项目成果到职业晋升:项目经理年终总结的
452
JS逆向-混淆加密-识别&还原-Eval&JSFuck&JS
936
2025年上海防水补漏谁家强?长三角标杆企业
615
正式接入DeepSeek-V3.2,国产AI“双剑合壁
398
守嘉陪诊师培训报名热潮引关注 独家实习机
911
顺序表实现线性结构
74
吴恩达深度学习课程四:计算机视觉 第二周
256
设计模式简述