可空类型NullableT鬼压床到底是什么么鬼

&&& 可空类型Nullable&T&是.NET Framework 2.0中新增的类型,用它声明的值类型,除了存值之外,还可以表示为null,即该类型的变量可以为空。
&&& 下面是Nullable结构的定义:
&1namespace&System
&3&&&&[Serializable]
&4&&&&public&struct&Nullable&T&&where&T&:&struct
&6&&&&&&&&public&Nullable(&T&value&);
&8&&&&&&&&public&static&explicit&operator&T(&T?&value&);
&9&&&&&&&&public&static&implicit&operator&T?(&T&value&);
11&&&&&&&&public&bool&HasValue&{&get;&}
13&&&&&&&&public&T&Value&{&get;&}
15&&&&&&&&public&override&bool&Equals(&object&other&);
16&&&&&&&&
17&&&&&&&&public&override&int&GetHashCode();
18&&&&&&&&
19&&&&&&&&public&T&GetValueOrDefault();
20&&&&&&&&
21&&&&&&&&public&T&GetValueOrDefault(&T&defaultValue&);
22&&&&&&&&
23&&&&&&&&public&override&string&ToString();
&&& 从定义可以看出,Nullable&T&结构中的类型参数T必须是一个结构,这就意味着Nullable&T&只支持将值类型用作可空类型,因为引用类型本身就是可空的。另外还可以看出,将值类型(如int)可以隐式地转换为可空类型,而可空类型转换为值类型则要进行显式转换。Nullable&T&还有两个重要的属性:HasValue和Value,前者判断变量内是值还是null,并返回一个布尔值,后者用于取出相应类型的值。很明显如何可空类型的变量此时保存的是null,那么使用Value属性会产生异常(InvalidOperationException)。
&&& 使用Nullable&T&声明一个存储int值的可空类型变量,可以这样写:
1Nullable&int&&a&=&null;
&&& 这样变量a既可以存储整型值,也可以存储null了。在C#中还有简化的写法:
int?&a&=&null;
&&& 这样用起来更加方便。
&&& 有了可空类型,那么在从数据库中取值时,如果碰到了NULL值,语句能简化一些,例如,如果不使用可空类型,那么语句可能会这样写:
1if&(dataReader["SSN"]&==&DBNull.Value)
2&&& ssn&=&-1;&// NULL&用&-1&代替
4&&& ssn&=&Convert.ToInt64(dataReader["SSN"]);
&&& 因为传统的值类型不能为null,所以必须为数据库中的NULL值提供一个无效的值,有时候这个无效的值并不好找。而使用可空类型,变量可以为null,那么我们就可以这样写:
1ssn&=&dataReader["SSN"]&==&DBNull.Value&?&(long?)null&:&Convert.ToInt64(dataReader["SSN"]);
&&& 在访问可空类型变量中的值时,最好先检查一下HasValue属性,判断一下是否有值,以避免异常发生,例如:
1if&(ssn.HasValue)
3&&& long&ssn&=&(long)&//&或&ssn.Value
4&&& Console.WriteLine("SSN&=&{0}",&ssn);
&&& 总之,适当地使用可空类型,能够简化代码,减少一些麻烦。
&&& 参考文档:
阅读(...) 评论()nullable - 必应 词典网络允许空值;值类型;可空类型1.允许空值毛毛的博客 - 毛毛 - 网易博客 ... A.Data_default 缺省值, A.nullable 允许空值, select A.column_name 字段名, ... |2.值类型可为空的值类型(Nullable&T&)需要注意的地方 Posted on
19:10 Tecky Li 阅读(3149) 评论(25) 编辑 收藏 值类型是不可以...|3.可空类型可空类型(Nullable) 我们知道引用类型都可以给赋个值null,表示空引用.而值类型不能赋值null. 值类型和引用类型的区别 要理解为什么...|4.空值类型本篇文章讨论可空值类型(Nullable&T&)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值。这来源于今天我们的一个 …|5.是否允许为空Perl DBI 高级属性 | Perl中国 ... 2,NAME,NAME_UC,NAME_LC — 取得字段名 3,NULLABLE — 是否允许为空
... |更多释义收起释义例句释义:全部,允许空值,值类型,可空类型类别:全部,口语,书面语,标题,技术来源:全部,字典,网络难度:全部,简单,中等,难更多例句筛选收起例句筛选1.
VARGRAPHIC
必应词典应用准确权威无广告下 载 手 机 版 必 应 词 典体 验 P C 版 必 应 词 典[text]返回顶部&/&关于是否在C#中加入不可空引用类型的争论围观&·&&0评论&·&&0香蕉&/&&&/&&已收藏&/&&/&关于是否在C#中加入不可空引用类型的争论
  英文原文:Debate:
Adding Non-nullable References to C#
  来自微软的
Mads Togersen 在近期所提出的一条提议,即在 C# 语言中加入对不可空引用类型的支持在 .NET 社区中引起了热烈的争论。人们对此提议的反应大相径庭,既有人对此表示赞赏,也不乏倾向于保持现状的意见。
Reddit 上,这条提议引起了大量关于向后兼容性方面的疑问。Strilanc 认为,如果应用了这一特性,按照这条提议的做法无法实现现有应用的平滑过渡:
这条提议还有待改进,它对于保证二进制兼容性、源代码兼容性以及现有代码的渐进式过渡方面还存在着一些考虑不周的情况。
该提议造成了程序集级别上的意义转变,每个引用类型的名称意义都将变为不可空。它将一次性让整个项目级别的代码块的意义发生巨大的改变,要顺利地完成这一过程,需要付出大量的成本并承担极高的风险。这一点非常糟糕。
该提议在泛型方面还有待改善,它完全没有提及在大量的泛型代码中将不允许使用
default (T)这一事实。这一点对于现有的代码将产生怎样的影响?可以采取哪些解决手段?那些确实需要这一功能的类型又将如何实现
default (T)的效果?这些问题都还没有进行充分的探索。
这种方式岂不是会允许数组包含一些无效的初始值吗?这种做法公然地违反了类型系统的意义,既然如此,何必还要将它硬塞进去呢?
  还有一方面的顾虑在于对于外部类库的向后兼容性,正如
Maplemario 所说:
那么问题来了。假设我要使用一个旧的类库,其中的函数都返回类型T,无法它是否是可空的。现在,该提议产生了语言范式上的转变,它将T视为不可空的T类型,而我所调用的某个函数却有可能返回 null(在编写这个类库时,这种做法是合法的)。如果这种场景在整个程序中是一个偶尔才需要进行测试的用例,那么在理想的情况下,项目文档将指出这一点,而我在阅读文档后就知道应当在调用时进行空检查。或者因为我记得这是一段陈旧的代码,因此我将始终进行空检查。而在实际情况下,由于“T即代表着不可空的T”,因此我无需再进行空检查。如此一来,这段程序就会在我对空指针进行取值时崩溃。
  人们也在热烈地讨论这一提议的替代方案。用户
00Davo 倾向于使用一种新的符号,以表示不可空类型。
我也乐于让纯粹的T类型总是代表不可空的引用,而只有T?才能够接受空值,但这种改变对于向后兼容性来说就是一场恶梦。如果能引入一个全新的、明确的不可空引用符号,那么向后兼容性就会坚挺许多。比如使用T!符号,如何?
  而在有些人看来,实现这一提议会造成的问题过多了。Number127 建议将静态分析作为一种替代方案:
遗憾的是,目前来看,如果要以一种优雅的方法引入不可空引用类型,会造成过多的兼容性问题。我认为最有希望的替代方案是在维持目前的类型系统的情况下,通过静态分析技术以检查某个引用是否能够保证不为空。
GitHub 的页面上,人们同样在讨论静态分析这一方案。Paulo Morgado 对此进行了更进一步的阐述,他表示这条提议其实就代表了静态分析的使用:
如果我的理解没错,这条提议其实就是一种增强版的方法契约而已。编译器在这里不会做出什么担保,更不用说运行时了。编译器所做的无非是对于那些声明为可空的变量进行数据流的分析而已。
  在另一个话题中,Tomas
Petricek 指出:这条提议必须考虑到其它 CLR 语言,例如F#:
该提议能否详细地说明一下如何在
CLR 级别保存可空的标注信息?(我猜测这些标注应当并不具有运行时的意义,它们只会表现为某种 .NET attribute,或某种其它类型的元数据?)
我希望未来某个版本的F#编译器能够辨识并理解这些标注信息,并定义某种“严格”模式,可空的类型在这种模式中将自动地暴露为
option&T& (或者差不多意思的某种类型)。
  对于不可空引用类型的争论其实并不新鲜,在过去几年中,对这一问题已经进行了多次讨论。正如原微软的首席开发者
Eric Lippert 所说,在一个已具有 15 年历史的语言中添加不可空引用是一项浩大的工程。
关于是否在C#中加入不可空引用类型的争论该投稿暂无简介关于是否在C#中加入不可空引用类型的争论关于是否在C#中加入不可空引用类型的争论[+展开简介]投1蕉安利给基友官方下载友情链接反馈本站不提供任何视听上传服务,所有内容均来自视频分享站点所提供的公开引用资源。Copyright (C)
AcFun. 保留所有权利

我要回帖

更多关于 鬼压床到底是什么 的文章

 

随机推荐