KeyValuePair什么都没有

时间:2010-07-02 16:57:02

标签: .net

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

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

if pair.??? Then Return

与结构一样,无法通过pair Is Nothing进行验证。

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

4 个答案:

答案 0 :(得分:12)

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

实际上,您要求完全同一个问题,即询问Integer变量是否具有值,将其设置为Nothing会使其值为0。你怎么能分辨出0和“真实”0之间的区别?你不能 - 这就是为什么Nullable(Of T)首先存在的原因。完全相同的逻辑适用于KeyValuePair

答案 1 :(得分:5)

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

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

请参阅C#答案:https://stackoverflow.com/a/1641405/151325

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

这个问题非常陈旧,但对于一个基本的解决方案:

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兼容。