为啥C#的可空类型,不允许应用于引用类型
为什么C#的可空类型,不允许应用于引用类型?
书上说,可空类型是为了适应变量需要存储值类型或者null类型的情况,为什么不能用于存储引用类型呢?
而且,我感觉这个定义有2个自相矛盾的地方,也就是说,
(1)null这个关键字本身代表着空引用,现在要用一个可空类型(存储值类型)的来放一个Null
同时System.Nullable<T>又是一个结构体,不是引用类型。那么结构体如何能存放null呢,说不通啊
(2)数组类型是引用类型对吧,为什么我可以声明一个可空的数组成员? 不是说可空的必须是值类型吗?
非常疑惑,求解释!
------解决思路----------------------
System.Nullable<T>是结构体,不是引用类型。所以不存在装箱和拆箱。他只不过在结构体内部有个特殊的标志位判断其是否为null。
引用类型本身就是可以为空的。所以根本不需要可空的引用类型。数组也是引用类型,所以本来就可以是null
可空值类型的存在是为了配合从数据库取值
int a=1;//正确
int b=null; //报错
int[] c=null;//正确
如上,如果你试图对一个int的类型赋值null,是会报错的。但是,当我们从数据库取值的时候,数据库有些column是int型的,但是允许为空。碰到这种情况,在C#用传统的int就没发处理了。所以才会有可空值类型存在。
------解决思路----------------------
https://msdn.microsoft.com/zh-cn/library/1t3y8s4s%28v=vs.80%29.aspx
摘取内容:
可空类型概述
可空类型具有以下特性:
可空类型表示可被赋值为 null 值的值类型变量。无法创建基于引用类型的可空类型。(引用类型已支持 null 值。)。
语法 T? 是 System.Nullable<T> 的简写,此处的 T 为值类型。这两种形式可以互换。
为可空类型赋值与为一般值类型赋值的方法相同,如 int? x = 10; 或 double? d = 4.108;。
如果基础类型的值为 null,请使用 System.Nullable.GetValueOrDefault 属性返回该基础类型所赋的值或默认值,例如 int j = x.GetValueOrDefault();
请使用 HasValue 和 Value 只读属性测试是否为空和检索值,例如 if(x.HasValue) j = x.Value;
如果此变量包含值,则 HasValue 属性返回 True;或者,如果此变量的值为空,则返回 False。
如果已赋值,则 Value 属性返回该值,否则将引发 System.InvalidOperationException。
可空类型变量的默认值将 HasValue 设置为 false。未定义 Value。
使用 ?? 运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,如 int? x = null; int y = x ?? -1;。
不允许使用嵌套的可空类型。将不编译下面一行:Nullable<Nullable<int>> n;
书上说,可空类型是为了适应变量需要存储值类型或者null类型的情况,为什么不能用于存储引用类型呢?
而且,我感觉这个定义有2个自相矛盾的地方,也就是说,
(1)null这个关键字本身代表着空引用,现在要用一个可空类型(存储值类型)的来放一个Null
同时System.Nullable<T>又是一个结构体,不是引用类型。那么结构体如何能存放null呢,说不通啊
(2)数组类型是引用类型对吧,为什么我可以声明一个可空的数组成员? 不是说可空的必须是值类型吗?
非常疑惑,求解释!
------解决思路----------------------
System.Nullable<T>是结构体,不是引用类型。所以不存在装箱和拆箱。他只不过在结构体内部有个特殊的标志位判断其是否为null。
引用类型本身就是可以为空的。所以根本不需要可空的引用类型。数组也是引用类型,所以本来就可以是null
可空值类型的存在是为了配合从数据库取值
int a=1;//正确
int b=null; //报错
int[] c=null;//正确
如上,如果你试图对一个int的类型赋值null,是会报错的。但是,当我们从数据库取值的时候,数据库有些column是int型的,但是允许为空。碰到这种情况,在C#用传统的int就没发处理了。所以才会有可空值类型存在。
------解决思路----------------------
https://msdn.microsoft.com/zh-cn/library/1t3y8s4s%28v=vs.80%29.aspx
摘取内容:
可空类型概述
可空类型具有以下特性:
可空类型表示可被赋值为 null 值的值类型变量。无法创建基于引用类型的可空类型。(引用类型已支持 null 值。)。
语法 T? 是 System.Nullable<T> 的简写,此处的 T 为值类型。这两种形式可以互换。
为可空类型赋值与为一般值类型赋值的方法相同,如 int? x = 10; 或 double? d = 4.108;。
如果基础类型的值为 null,请使用 System.Nullable.GetValueOrDefault 属性返回该基础类型所赋的值或默认值,例如 int j = x.GetValueOrDefault();
请使用 HasValue 和 Value 只读属性测试是否为空和检索值,例如 if(x.HasValue) j = x.Value;
如果此变量包含值,则 HasValue 属性返回 True;或者,如果此变量的值为空,则返回 False。
如果已赋值,则 Value 属性返回该值,否则将引发 System.InvalidOperationException。
可空类型变量的默认值将 HasValue 设置为 false。未定义 Value。
使用 ?? 运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,如 int? x = null; int y = x ?? -1;。
不允许使用嵌套的可空类型。将不编译下面一行:Nullable<Nullable<int>> n;