C# 可空类型之间的差异”;“没有价值”;及;“为空”;在C中#
术语上有什么区别C# 可空类型之间的差异”;“没有价值”;及;“为空”;在C中#,c#,C#,术语上有什么区别 没有价值 及 2.无效 在C#中的可空类型中 换句话说,我们什么时候说类型没有值,什么时候说值为null。aNullable本身不能为null,因为它是一个结构。因此,您可能会发现一个可为null的,其大小写如下:没有值,但实际上它不是null 编辑: ----------------------------没有值大小写----可以是空大小写 引用类型-----(等于可以是空大小写)---可能 值类型------------不可能------------------不可能 可
Nullable
本身不能为null,因为它是一个结构。因此,您可能会发现一个可为null的
,其大小写如下:没有值
,但实际上它不是null
编辑:
----------------------------没有值大小写----可以是空大小写
引用类型-----(等于可以是空大小写)---可能 值类型------------不可能------------------不可能 可为空的--------------可能--------------------不可能 这里,可空类型和值类型的分离并不意味着
可空
不是值类型。可空
是一个结构,作为一个结构,它实际上永远不能为空。Nullable
中存储的唯一实际数据是T
类型的基础值和布尔HasValue
标志。如果HasValue
中的null
值为false,则可以将其视为null
,即使从技术上讲它不是null
有一些编译器魔法可以调用someNullable==null
,并且该表达式的结果实际上与someNullable.HasValue
相同。您还可以将null
分配给Nullable
。实际上,这将创建一个新的nullabe
结构,其中HasValue
为false
。(有趣的是,如果你要自己写类型,你不可能自己写。)
还有一些更神奇的编译器,如果你把一个Nullalbe
框起来,它实际上就不会把可为null的类型框起来。如果HasValue
实际上为true,则它将拉出基础值并选中该框。如果HasValue
为false,那么它将只选择框null
。当将某个内容取消装箱为可空时,它会执行相反的操作;根据是否为null创建可为null的结构。(这是使用自定义类型无法完成的另一件事。)
由于这些特殊的编译器特性,它很好地使它看起来像是
null
实际上可以是null
,但事实是它实际上不是null已经提到了泛型null类型,null
(其中T必须是值类型)具有以下重要特性:
bool HasValue // Indicating that a real value is present, or if the instance should be considered null
T Value // Your value, if present. (non-nullable)
因此,可以想象,可为空的myInt的情况如下:
HasValue | Value | Represents
------------------------------
false | 0 | No Value / null
true | 0 | 0
true | 3 | 3
在第一种情况下,HasValue
表示myInt
没有值,并表示null
状态;与空文本的相等比较将被视为真:
(myInt == null) // true.
可为null的类型本身实际上不会为null(它是一个结构,不可能为null),但编译器将通过查询HasValue
(如另一个中所述)来解决null比较问题。如果我们讨论的是术语,让我们先了解一下语言。正如许多其他答案所说,在c#中,当使用?
运算符将不可为null的类型设置为可为null时,它将成为可为null的结构,其中T将始终是值类型
参考:
请参阅Servy的答案,以获得对此的良好解释
但是,一旦任何类型都是可空的(无论它是引用类型还是已使用可空结构),就可以正确地说,如果该类型没有值,则该类型为空,反之亦然。从上述Microsoft文档:
如果一个类型可以赋值,或者可以
赋值为null,这意味着类型没有任何值
@GrantWinney这似乎是个问题,尽管我认为你把它复杂化了<代码>字符串myStr代码>vs字符串myStr=null
将满足条件。但是Nullable本身不是一个不可为null的类型吗?@MaxPRafferty他在他的第一句话中说,@MaxPRaffertyNullable
是一个结构,因此它是一个值类型,并且本身不能为null。但是它的值
成员可能为空。@HosseinNarimaniRad怎么办?这是一个结构。它是非空的。如果它是可空的,那么首先就没有理由使用nullable
。当null
值表示null
时,值可以有任何内容;这是垃圾数据。一般来说,它会有默认值,尽管里面有什么位并不重要,因为它不能被读取。@HosseinNarimaniRad:null
的value
属性是t
,这是一种值类型,所以也不是null。您可以将可为null的与null进行比较,但它不是null(请参阅)。