C# 可空类型之间的差异”;“没有价值”;及;“为空”;在C中#

C# 可空类型之间的差异”;“没有价值”;及;“为空”;在C中#,c#,C#,术语上有什么区别 没有价值 及 2.无效 在C#中的可空类型中 换句话说,我们什么时候说类型没有值,什么时候说值为null。aNullable本身不能为null,因为它是一个结构。因此,您可能会发现一个可为null的,其大小写如下:没有值,但实际上它不是null 编辑: ----------------------------没有值大小写----可以是空大小写 引用类型-----(等于可以是空大小写)---可能 值类型------------不可能------------------不可能 可

术语上有什么区别

  • 没有价值
  • 2.无效

    在C#中的可空类型中

    换句话说,我们什么时候说类型没有值,什么时候说值为null。

    a
    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这似乎是个问题,尽管我认为你把它复杂化了<代码>字符串myStrvs
    字符串myStr=null
    将满足条件。但是Nullable本身不是一个不可为null的类型吗?@MaxPRafferty他在他的第一句话中说,@MaxPRafferty
    Nullable
    是一个结构,因此它是一个值类型,并且本身不能为null。但是它的
    成员可能为空。@HosseinNarimaniRad怎么办?这是一个结构。它是非空的。如果它是可空的,那么首先就没有理由使用
    nullable
    。当
    null
    值表示
    null
    时,
    值可以有任何内容;这是垃圾数据。一般来说,它会有默认值,尽管里面有什么位并不重要,因为它不能被读取。@HosseinNarimaniRad:
    null
    value
    属性是
    t
    ,这是一种值类型,所以也不是null。您可以将
    可为null的
    与null进行比较,但它不是null(请参阅)。