我们如何验证(.NET 2)KeyValuePair
是否分配了值?
Dim pair as KeyValuePair(Of A, B) = Nothing
if pair.??? Then Return
与结构一样,无法通过pair Is Nothing
进行验证。
点结构,例如。有一个 p.IsEmpty
验证。
答案 0 :(得分:12)
这里不是使用“普通”类型 - 这意味着您无法检测默认值A
和B
作为键和值的值之间的差异,您应该使用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
答案 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
在这种情况下,A
或B
需要与= Nothing
或Is Nothing
兼容。