• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#基础知识 全面解析可空类型

C#基础知识 全面解析可空类型

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#基础知识,c#基础知识总结,c#基础知识点,c#基础数据类型,c#零基础入门教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

引言:

  C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容(最近一直都在思考如何来分享这篇文章的,因为刚开始觉得可空类型使用过程中比较简单,觉得没有讲的必要,但是考虑到这个系列的完整性,决定还是唠叨下吧,希望对一些不熟悉的人有帮助)。

一、为什么会有可空类型

   如果朋友们看了我之前的分享,对于这一部分都不会陌生,因为我一般介绍C#特性经常会以这样的方式开头的, 因为每个特性都是有它出现的原因的(有一句佛语这是这么讲的:万事皆有因,有因必有果),首先来说说这个因的(果当然是新增加了可空类型这个新特性了。),当我们在设计数据库的时候,我们可以设置数据库字段允许为null值,如果数据库字段是日期等这样在C#语言是值类型时,当我们把数据库表映射一个对象时,此时Datetime类型在C# 语言中是不能为null的,如果这样就会与数据库的设计有所冲突,这样开发人员就会有这样的需求了——值类型能不能也为可空类型的?同时微软也看出了用户有这样的需求,所以微软在C# 2.0中就新增加了一种类型——可空类型,即包含null值的值类型,这个也就是我理解的因了,介绍完因之后,当然就是好好唠叨下可空类型是个什么东西的了?

二、可空类型的介绍

   可空类型也是值类型,只是它是包含null的一个值类型。我们可以像下面这样表示可空类型(相信大家都不陌生):

  上面代码 int? 就是可空的int类型(有人可能会这样的疑问的, 如果在C#1中我硬要让一个值类型为一个可空类型怎么办到呢?当然这个在C#1之前也是有可以办到的,只是会相当麻烦,对于这个如果有兴趣的朋友可以去刨下根),然而其实 "?"这个修饰符只是C#提供的一个语法糖(所谓语法糖,就是C#提供的一种方便的形式,其实肯定没有int? 这个类型,这个int?编译器认为的就是Nullable<int>类型,即可空类型),其实真真C# 2.0提供的可空类型是——Nullable<T>(这个T就是上专题介绍的泛型参数,其中T只能为值类型,因为从可空类型的定义为:public struct Nullable<T> where T : struct)和Nullable。下面给出一段代码来介绍可空类型的使用:

输出结果:

上面的演示代码中都注释,这里就不再解释了,为了让大家明白进一步理解可空类型是值类型,下面贴出中间语言代码截图:

三、空合并操作符(?? 操作符)

  ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为null,就返回右边的数,这个操作符可以用于可空类型,也可以用于引用类型,但是不能用于值类型(之所以不能应用值类型(这里除了可空类型),因为??运算符要对左边的数与null进行比较,然而值类型,不能与null类型比较,所以就不支持??运算符),下面用一个例子来掩饰下??运算符的使用(??这个运算符可以方便我们设置默认值,可以避免在代码中写if, else语句,简单代码数量,从而有利于阅读。)

四、可空类型的装箱和拆箱

   值类型存在装箱和拆箱的过程,可空类型也属于值类型,从而也有装箱和拆箱的过程的, 这里先介绍下装箱和拆箱的概念的, 装箱指的的从值类型到引用类型的过程,拆箱当然也就是装箱的反过程,即从引用类型到值类型的过程(这里进一步解释下我理解的装箱和拆箱,首先.Net中值类型是分配在堆栈上的,然而引用类型分配在托管堆上,装箱过程就是把值类型的值从推栈上拷贝到托管堆上,然后推栈上存储的是对托管堆上拷贝值的引用,然而拆箱就是把托管堆上的值拷贝到堆栈上.简单一句话概况,装箱和拆箱就是一个值的拷贝的一个过程,就想搬家一样,把东西从一个地方搬到另一个地方,对于深入的理解,大家可以参考下园中的博文.), 括号中是我理解的装箱和拆箱的过程,下面就具体介绍下可空类型的装箱和拆箱的:

  当把一个可空类型赋给一个引用类型变量时,此时CLR 会对可空类型(Nullable<T>)对象进行装箱处理,首先CLR会检测可空类型是否为null,如果为null,CLR则不进行实际的装箱操作(因为null可以直接赋给一个引用类型变量),如果不为null,CLR会从可空类型对象中获取值,并对该值进行装箱(这个过程就是值类型的装箱过程了。),当把一个已装箱的值类型赋给一个可空类型变量时,此时CLR会对已装箱的值类型进行拆箱处理,如果已装箱值类型的引用为null,此时CLR会把可空类型设为null(如果觉得啰嗦,大家可以直接看下面的代码,代码中也会有详细的注释)。下面用一个示例来演示下可空类型的装箱和拆箱的使用,这样可以帮助大家更好的理解前面介绍的概念:

代码如下:</div>

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于C#基础知识回顾--反射(三)
  • 关于C#基础知识回顾--反射(二)
  • 关于C#基础知识回顾--反射(一)
  • C#基础知识 全面解析可空类型

相关文章

  • 2017-05-28c# 删除所有的空文件夹的小例子
  • 2017-05-28C#中实现网段扫描的代码
  • 2017-05-28c# 动态加载dll文件,并实现调用其中的方法(推荐)
  • 2017-05-28浅谈C#中的常量、类型推断和作用域
  • 2017-05-28WinForm特效之桌面上的遮罩层实现方法
  • 2017-05-28C#计算字符串相似性的方法
  • 2017-05-28深入c#工厂模式的详解
  • 2017-05-28asp.net之生成验证码的方法集锦(一)
  • 2017-05-28C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)
  • 2017-05-28c#字符长度查询代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C# SqlHelper应用开发学习
    • C#执行外部命令的方法
    • C#实现写入文本文件内容的方法
    • C#将布尔类型转换成字节数组的方法
    • C#中的扩展方法详解
    • C#自定义事件监听实现方法
    • WinForm防止程序重复运行的方法分析
    • c# 冒泡排序算法(Bubble Sort) 附实例代码
    • C#生成饼形图及添加文字说明实例代码
    • C#实现操作windows系统服务(service)的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有