【问题标题】:KeyValuePair Is NothingKeyValuePair 什么都不是
【发布时间】:2010-07-02 16:57:01
【问题描述】:

我们如何验证 (.NET 2) KeyValuePair 是否已分配值?

Dim pair as KeyValuePair(Of A, B) = Nothing

if pair.??? Then Return

由于它是一个结构,它无法使用pair Is Nothing 进行验证。

Point 结构,例如。有 p.IsEmpty 验证。

【问题讨论】:

    标签: .net


    【解决方案1】:

    而不是在这里使用“正常”类型 - 这意味着您无法检测到默认值 AB 作为键和值的值之间的差异,您应该使用 Nullable(Of KeyValuePair(Of A, B)) .

    实际上,您问完全与询问Integer 变量是否具有值相同的问题,将其设置为Nothing 将赋予其值0。你怎么知道那个 0 和“真正的”0 之间的区别?你不能——这就是为什么Nullable(Of T) 首先存在的原因。完全相同的逻辑适用于KeyValuePair

    【讨论】:

    • 那么,您确认对于该结构,.NET 没有像 Point 那样提供“空检测”机制?.. 因为Point = Nothing === Point.IsEmpty
    • @serhio:没有这样的通用机制,不。
    【解决方案2】:

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

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

    查看 C# 答案:https://stackoverflow.com/a/1641405/151325

    【讨论】:

    • 在某些情况下,例如通过.SingleOrDefaultFirstOrDefault 使用Linq 时,您没有机会处理Nullable(Of KeyValuePair(Of A, B))。与此特定案例的公认答案相反,此答案确实有效,对我来说似乎很安全。
    【解决方案3】:

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

    引入了Nullable(Of T) 类型,而不是强制所有希望支持空值或空值概念的值类型。这实质上采用了后者(即布尔标志)概念,并使其可用于每个值类型,包括系统和用户定义的。它还允许在 Nullable(Of T)Nothing(C# 中的 null)之间进行比较,以检查值是否存在。

    但是,应该明确的一点是(作为值类型本身),Nullable(Of T) 结构实际上绝不是空引用;将其与Nothing 进行比较的能力纯粹是 VB.NET 和 C# 中都存在的语言功能。在幕后,所有这些比较实际上都是在检查结构上的HasValue 属性。此外,如果 HasValue 为 false,则访问结构的 Value 属性会引发异常。

    【讨论】:

    • 对于性能 POW,Nullable 类型的性能是否比其带有标志的“正常”结构少得多?
    • @serhio:不;虽然泛型在技术上确实会引入一些开销,但并不大。
    【解决方案4】:

    这个问题很老了,但是对于一个基本的解决方案:

    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
    

    在这种情况下,AB 需要与 = NothingIs Nothing 兼容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-09
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 2018-07-18
      • 2010-12-18
      • 1970-01-01
      相关资源
      最近更新 更多