代码之家  ›  专栏  ›  技术社区  ›  serhio

keyValuePair什么都不是

  •  3
  • serhio  · 技术社区  · 15 年前

    我们如何验证(.net 2)如果 KeyValuePair 是否分配了值?

    Dim pair as KeyValuePair(Of A, B) = Nothing
    
    if pair.??? Then Return
    

    它是一个结构,它 不能 用……核实 pair Is Nothing .

    结构,例如 p.IsEmpty 验证。

    4 回复  |  直到 12 年前
        1
  •  12
  •   Jon Skeet    15 年前

    而不是在这里使用“普通”类型-这意味着您无法检测默认值为 A B 作为键和值,应该使用 Nullable(Of KeyValuePair(Of A, B)) .

    实际上你在问 确切地 和询问 Integer 变量有一个值,将其设置为 Nothing 会给它一个0的值。你怎么能分辨出0和“真实的”0之间的区别?你不能-这就是为什么 Nullable(Of T) 首先存在。同样的逻辑也适用于 KeyValuePair .

        2
  •  5
  •   Community Mohan Dere    8 年前

    您可以将它与空的keyValuePair进行比较,而不是可以为空的类型:

    If pair.Equals(New KeyValuePair(Of A, B)) Then Return
    

    见C答案: https://stackoverflow.com/a/1641405/151325

        3
  •  1
  •   Adam Robinson    15 年前

    这就是 Nullable(Of T) 类型为。在.NET 2.0中引入泛型(这使得此类型成为可能)之前,任何希望公开语义“空”值的值类型都必须自己这样做。这通常由结构表示,使用“保留值”表示“空”,如您所见 Point 在哪里 (0, 0) 被认为是“空的”。无法区分 那是空的 代表原点。其他的方法是通过使用布尔标志来表示EMTPY值,但是这些类型的使用方式是非结构化的(因为消费代码在变量中仍然有一个值)。

    而不是强制每个希望支持空值或空值概念的值类型, 空的(t) 介绍了类型。这基本上采用了后一种(即布尔标记)概念,并使其可用于系统和用户定义的每种值类型。它还允许比较 空的(t) Nothing ( null 在C)中检查是否存在值。

    然而,有一件事应该明确,那就是(作为值类型本身), 空的(t) 结构实际上从来不是空引用;能够将其与 没有什么 纯粹是一种语言特性,在vb.net和c中都存在。在封面下,所有这些比较实际上都在检查 HasValue 结构上的属性。此外,访问 Value 如果 哈斯值 是假的。

        4
  •  0
  •   user326608    12 年前

    这个问题很古老,但作为一个基本的解决方案:

    Dim pair as New KeyValuePair(Of A, B)(Nothing, Nothing)
    '...'
    '<some code that may or may not set pair to KeyValuePair(Of A, B)(Something, Something)>'
    '...'
    if pair.Key = Nothing Then Return ' some code did not fire
    

    在这种情况下,要么 A B 需要与 = Nothing Is Nothing .

    推荐文章