热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#2的重大改进之可空类型

C#2的重大改进之可空类型C#2的重大改进之可空类型C#1如何解决可空类型C#2的可空类型可空类型的装箱与拆箱Nuallable可空类型的工具类C#2为可空类型提供的语法糖——&#

C# 2的重大改进之可空类型
C# 2的重大改进之可空类型
C# 1如何解决可空类型
C# 2的可空类型
可空类型的装箱与拆箱
Nuallable可空类型的工具类
C# 2为可空类型提供的语法糖——?修饰符
C# 2中as操作符可以用于可空类型
空合并操作符——??

在操作数据库时,经常需要为DateTime设置可空值。在C# 1时是无法为DateTime赋值为null的。

C# 1如何解决可空类型

三种方式:

  1. 魔法数:牺牲一个值,来表示空值。
  2. 引用类型包装:使用一个包含值类型字段的包装类型。这样就可以直接赋值为null了,问题是会造成GC的压力。或者直接使用object作为类型,再根据需要进行装箱或拆箱。
  3. 额外的布尔值:创建新的类型,包含布尔值和一个实例字段,由于使用的是值类型,可以避免GC的问题。
    无论如何上述三种方式还是挺麻烦的,所以C# 2做出了改进——可空类型。

C# 2的可空类型

可空类型:System.Nullable以及可空类型的工具类System.Nullable
可空类型有HasValue和Value两个属性,看图:

可空类型的装箱与拆箱

可空类型是一个结构——值类型。所以把它转换为引用类型时需要进行装箱。但是由于可空类型的特殊性,CLR会让可空类型的装箱有两种,装箱为空引用,或者装箱成T的一个已装箱的值。

对应的拆箱行为,已装箱的值可以拆箱成普通值类型,或者对应的可空类型(已赋值),但是拆箱空引用时,只能拆箱为可空类型(未赋值),拆箱成普通值类型会抛出NullReferenceException。

Nuallable可空类型的工具类

比较方法:

  • public static int Compare(Nuallable n1, Nuallable n2)
  • public static bool Equals(Nullable n1, Nuallable n2)
    两个方法都遵循约定:空值与空值相等,都小于其它所有值。

还有一个工具方法——获取可空类型的基本类型:
public static Type GetUnderlyingType(Type nullableType)

C# 2为可空类型提供的语法糖——?修饰符

C#编译器允许使用null在比较和赋值时表示一个可空类型的空值。int? nullable = 5;

C# 2中as操作符可以用于可空类型

int? nullable = o as int?;

空合并操作符——??

first ?? second首先对first进行求值,如果first != null,就返回first的结果,否则就对second进行求值作为整个表达式的结果。
空合并操作符是右结合的,first ?? second ?? third等价于first ?? (second ?? third)
将可空类型赋值给它的基本类型时会发生隐式类型转换。所以空合并运算符可以用于可空类型。



来自为知笔记(Wiz)



转:https://www.cnblogs.com/qianzi067/p/6040757.html



推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
author-avatar
義忠仁倫冧沫Bob
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有