中文源码网
欢迎您!
会员登录
会员注册
发布自媒体
发布模版
发布源码
发布模版
发布酷站
推荐源码
常用源码
帮助中心
栏目导航
热门搜索:
网站首页
免费源码
精品源码
html模版
精品模版
酷站大全
技术文档
方案大全
网络教程
站长自媒体
新闻动态
帮助中心
免费源码下载
asp源码
php源码
python源码
.net源码
jsp源码
JS特效
安卓源码
IOS源码
微信小程序下载
毕业设计源码下载
模版下载
商城模版
手机wap模版
网络教程
html5教程
asp教程
php教程
jsp教程
Python语言技术文档
python入门
Python编程技巧
Python网站web
Python网络爬虫
Python自动化运维
数据挖掘/机器学习
Python人工智能
Python多媒体
Python科学计算
Python游戏开发
Python图形界面
Python数据库相关
Python与其他语言
Python库/模块大全
Python报错处理大全
微信小程序技术文档
微信小程序开发入门
微信小程序开发技巧
微信游戏开发
微信公众号开发
微信常用源码
php语言技术文档
php入门教程
php技巧
php函数/类库
php框架
php+AJAX技巧
开源系统及二次开发
PHP内核
jsp语言技术文档
jsp入门教程
jsp技巧
jsp框架
asp语言技术文档
asp入门教程
asp技巧
asp函数/类库
C#/.NET语言技术文档
C#/.NET入门教程
C#/.NET技巧
MVC/.NET框架
C#/.NET微信开发
程序报错解决方法
html5/css技术文档
html5
CSS
javascript
javascript技巧
jquery
json
ajax
js框架/js库
点击排行
总结PHP中初始化空数组的最佳方法
在PHP中输出JS语句以及乱码问题的解决方案
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
用PHP的反射实现委托模式的讲解
详解提高使用Java反射的效率方法
详解关于php的xdebug配置(编辑器vscode)
详解php中生成标准uuid(guid)的方法
详解php中curl返回false的解决办法
详解php用static方法的原因
详解php伪造Referer请求反盗链资源
详解PHP素材图片上传、下载功能
详解PHP实现支付宝小程序用户授权的工具类
详解PHP神奇又有用的Trait
详解PHP队列的实现
详解PHP的抽象类和抽象方法以及接口总结
您现在的位置:
首页
>
技术文档
>
C#/.NET技巧
我要投稿
ASP.NET中可空值类型【Nullable<T>】实现原理
来源:
中文源码网
浏览:158 次 日期:2024-05-16 01:59:22
【下载文档:
ASP.NET中可空值类型【Nullable<T>】实现原理.txt
】
.NET中可空值类型【Nullable
】实现原理
为了让.Net中的值类型可以赋值为null,微软特地添加了Nullable
类型,也可简写为T?。但是Nullable
自身是结构体,也是值类型,那么它是如何实现将null赋值给值类型的呢?
下面通过自定义一个可空值类型来讲解Nullable
的实现原理。
自定义可空值类型
struct XfhNullable
where T : struct
{
private T innerValue;
//这个属性很重要
public bool HasValue { set; get; }
public T Value
{
get
{
return HasValue ? innerValue: throw new InvalidOperationException();
}
}
public XfhNullable(T value)
{
this.innerValue= value;
HasValue = true;
}
public T GetValueOrDefault(T value)
{
return HasValue ? this.innerValue: value;
}
public T GetValueOrDefault()
{
return this.innerValue;
}
}
一个可空值类型的结构体大致功能已经定义好了,下面我们来创建可空值类型的实例来验证下。
using static System.Console;
class Program
{
static void Main()
{
//使用结构体默认的无参构造函数进行实例化
XfhNullable
num = new XfhNullable
();
WriteLine(num.HasValue);
WriteLine(null_num.GetValueOrDefault());
}
}
可以看到,变量num并不含有值,调用GetValueOrDefault()则会获取它的默认值 0;
这时我们将null赋值给变量num会发现编译器报错Cannot convert null to 'XfhNullable
' because it is a non-nullable value type这是因为编译器把我们定义的结构体XfhNullable
看作是普通值类型而非可空值类型,所以我们还要添加可空值类型和XfhNullable
之间的转换功能。
public static implicit operator XfhNullable
(T? nullabelValue)
{
if (nullabelValue== null)
{
return new XfhNullable
();
}
return new XfhNullable
(nullabelValue.Value);
}
上面的代码实现了可空值类型向XfhNullable
的隐式转换,添加上面代码之后发现编译器不再报错。XfhNullable
已经成为一个可为null的值类型。
static void Main()
{
XfhNullable
null_num = null;
WriteLine(null_num.HasValue);
}
XfhNullable
中的属性HasValue的作用就是标记当前类型是否为null,若是则返回False,否则返回True。当HasValue为False时调用该类型的Value属性则会抛出异常InvalidOperationException。但可调用GetValueOrDefault()方法来获取类型的默认值。
Nullable
类型可以通过运算符==来判断值是否为null,我们也可以通过运算符重载来实现该功能:
public static bool operator ==(XfhNullable
cn, object obj)
{
if (cn.HasValue)
{
return false;
}
return true;
}
public static bool operator !=(XfhNullable
cn, object obj)
{
return !(cn == obj);
}
static void Main()
{
XfhNullable
null_num = null;
WriteLine(null_num == null);
}
接下来,我们来实现普通值类型和XfhNullable
之间的转换:
public static implicit operator XfhNullable
(T value)
{
return new XfhNullable
(value);
}
public static explicit operator T(XfhNullable
value)
{
return value.innerValue;
}
static void Main()
{
XfhNullable
null_num = null;
null_num = 12;//int类型隐式转换为XfhNullable
类型
WriteLine(null_num == null);
WriteLine(null_num.Value);
int i = (int)null_num;//XfhNullable
类型强制转换为int类型
WriteLine(i);
}
获取实例在运行时的类型:
static void Main()
{
XfhNullable
null_num = 12;
WriteLine(null_num.GetType());
}
这个返回值不大友好,我们希望这里返回内置的值类型,System.Int32,具体实现代码如下:
//因为Object类中的GetType方法不允许子类重写(避免子类隐藏自己的实际类型)
//所以这里使用关键字new来隐藏Object类中的GetType方法
public new Type GetType()
{
return innerValue.GetType();
}
结论:没有可为空的值类型
至此,我们已经自定义了一个可为空的值类型XfhNullable
,通过以上代码,我们不难发现所谓可为空的值类型是不存在的,它是通过属性HasValue来对null值进行标记的,其内部通过字段innerValue(该字段对应Nullable
中的value字段)来维护该类型的值,若被赋值为null则innerValue初始化为值类型的初始值。换句话说,Nullable
只是在逻辑层面上实现了把null赋值给值类型,给我们一种值类型可为null的感觉。
最后说下可空值类型的装箱与拆箱。
CLR在对Nullable
实例执行装箱操作时首先检查它是否为null,若是则CLR不装箱任何东西而是直接返回null;若实例的值不是null则获取该实例的值(Value属性)并对这个值进行装箱操作。
拆箱时,对于null则返回一个Nullable
()实例,对于一个具体的数值,如5,则返回Nullable
(5)实例。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持中文源码网!
上一篇:
ASP.NET中接口与类的区别浅析
下一篇:
ASP.Net中利用CSS实现多界面的两种方法
相关内容
•
.NET c# 单体模式(Singleton)
•
.NET C#创建WebService服务简单实例
•
.net 操作xml的简单方法及说明
•
.Net 单例模式(Singleton)
•
.net 上传文件前所未有的简单
•
.NET 下运用策略模式(组合行为和实体的一种模式)
•
.Net笔记_System.IO之windows文件操作的深入分析
•
.NET编辑的.dll 文件反编译的工具软件集合
•
.NET操作Excel实例分享
•
.Net读取Excel 返回DataTable实例代码
•
.net读取Rss转换为DataTable
•
.NET读写Excel工具Spire.Xls使用 对数据操作与控制(4)
•
.NET分页控件简单学习
•
.NET工厂方法模式讲解
•
.NET获取客户端的操作系统版本、浏览器版本和IP地址
•
.NET简单工厂模式讲解
•
.NET建造者模式讲解
•
.NET开发基础_从简单的例子理解泛型 分享
•
.NET连接数据库以及基本的增删改查操作教程
•
.net前台调用后台函数的简单实例
•
.NET桥接模式讲解
•
.net全局定时定期执行某些操作在Global.asax中具体实现
•
.net设计模式之装饰模式(Decorator)
•
.net实现webservice简单实例分享
•
.NET实现XML与DataTable互转的实例代码
•
.NET实现简易的文件增量备份程序
•
.NET适配器模式讲解
•
.NET下通过HttpListener实现简单的Http服务
•
.Net项目中一些常用验证操作
•
.NET异步编程总结----四种实现模式代码总结
•
.NET原型模式讲解
•
.NET中的IO操作之文件流用法分析
•
.NET中的repeater简介及分页效果
•
.NET中基于事件的异步模式-EAP
•
.NET中开源文档操作组件DocX的介绍与使用
•
.Net中如何操作IIS的虚拟目录原理分析及实现方案
•
.NET中如何将文本文件的内容存储到DataSet
•
.NET装饰模式讲解
•
10个.NET中删除空白字符串的方法
•
12306动态验证码启发之ASP.NET实现动态GIF验证码(附源码)
•
12小时制和24小时制获取当天零点的问题探讨
•
2个页面间不通过Session与url的传值方式
•
ADO.Net 类型化DataSet的简单介绍
•
ADO.NET获取数据(DataSet)同时获取表的架构实例
•
AjaxControlToolKit 显示浏览者本地语言的方法
•
Ajax实现异步刷新验证用户名是否已存在的具体方法
•
AlternatingItemTemplate类似于 ItemTemplate 元素
•
ashx介绍以及ashx文件与aspx文件之间的区别
•
ashx文件的使用小结
•
ashx中使用session的方法(获取session值)
•
Asp .net 调用带参数的存储过程
•
ASP .NET 可编辑输入自动匹配的下拉框
•
ASP .NET调用javascript中Response.Write和ClientScript.RegisterStartupScript的区别
•
asp .net实现给图片添加图片水印方法示例
•
asp DataTable添加列和行的三种方法
•
asp. net下使用foreach简化文本文件的访问。
•
asp.C#实现图片文件与base64string编码解码
•
asp.ent(C#)中判断空字符串的3种方法以及性能分析
•
asp.ent下合并两个结构相同的DataTable
•
asp.net 动态引用样式表代码
•
asp.net 1.1_ 2.0 中快速实现单点登陆
•
ASP.NET 2.0 URL映射技巧
•
ASP.NET 2.0 程序安全的基础知识
•
ASP.NET 2.0 的压缩功能代码
•
Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现
•
ASP.NET 2.0 原汁原味读取注册表
•
ASP.NET 2.0 中Forms安全认证
•
asp.net 2.0 中的URL重写以及urlMappings问题
•
ASP.NET 2.0 中的创建母版页
•
ASP.NET 2.0 中收集的小功能点(转)
•
ASP.NET 2.0_3.5中直接操作Gridview控件插入新记录
•
asp.net 2.0的文件上传(突破上传限制4M)
•
asp.net 2.0里也可以用JSON的使用方法
•
ASP.NET 2.0下的条件编译
•
ASP.NET 2.0下随机读取Access记录的实现方法
•
ASP.NET 2.0写无限级下拉菜单
•
ASP.NET 2.0中的数据操作之八:使用两个DropDownList过滤的主_从报表
•
ASP.NET 2.0中的数据操作之九:跨页面的主_从报表
•
ASP.NET 2.0中的数据操作之七:使用DropDownList过滤的主_从报表
•
ASP.NET 2.0中的页面输出缓存
•
ASP.NET 2.0中预设的cookie
•
asp.net 2个日期之间的整月数的算法
•
ASP.NET 4.5 异步IO 相关实例
•
ASP.NET 5升级后如何删除旧版本的DNX
•
ASP.NET 5中使用AzureAD实现单点登录
•
ASP.NET 6种常用数据库的连接方法
•
asp.net access添加返回自递增id的实现方法第1_3页
•
asp.net Ajax 安装与卸载方法
•
asp.net ajaxControlToolkit FilteredTextBoxExtender的简单用法
•
asp.net ajaxControlToolkit ValidatorCalloutExtender的简单用法
•
Asp.net ajax实现任务提示页面的简单代码
•
ASP.NET ASHX中获得Session的方法
•
asp.net AutoCompleteExtender的一个简单例子代码
•
asp.net B2B网站对接支付宝接口
•
asp.net BackgroundWorker之在后台下载文件
•
asp.net BasePage类+Session通用用户登录权限控制
•
asp.net BOF或EOF有一个是真,或者当前记录已被删除
•
asp.net Bundle功能扩展
•
asp.net button 绑定多个参数
•
asp.net C# 时间间隔的计算方法
•
asp.net c# 抓取页面信息方法介绍
•
asp.net c#采集需要登录页面的实现原理及代码
•
asp.net C#检查URL是否有效的方法
•
asp.net C#生成和解析二维码的实例代码
•
ASP.NET C#生成缩略图实现思路分解
•
ASP.NET C#生成下拉列表树实现代码
•
asp.net C#实现解压缩文件的方法
•
asp.net C#实现下载文件的六种方法实例
•
ASP.NET Cache的一些总结分享
•
Asp.Net Cache缓存使用代码
•
asp.net CheckBoxList各项最小宽度CSS样式(兼容性good)
•
asp.net ckeditor编辑器的使用方法
•
asp.net Context.Handler 页面间传值方法第1_2页
•
ASP.NET Cookie 操作实现
•
ASP.NET Cookies安全性实践分析
•
asp.net COOKIES需要注意的一点
•
asp.net Cookie操作类
•
asp.net cookie的操作,写入、读取与操作
•
Asp.net cookie的处理流程深入分析
•
asp.net cookie的读写实例
QQ客服
公众号
手机版
帮助中心