【发布时间】: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
我们如何验证 (.NET 2) KeyValuePair 是否已分配值?
Dim pair as KeyValuePair(Of A, B) = Nothing
if pair.??? Then Return
由于它是一个结构,它无法使用pair Is Nothing 进行验证。
Point 结构,例如。有 p.IsEmpty 验证。
【问题讨论】:
标签: .net
而不是在这里使用“正常”类型 - 这意味着您无法检测到默认值 A 和 B 作为键和值的值之间的差异,您应该使用 Nullable(Of KeyValuePair(Of A, B)) .
实际上,您问完全与询问Integer 变量是否具有值相同的问题,将其设置为Nothing 将赋予其值0。你怎么知道那个 0 和“真正的”0 之间的区别?你不能——这就是为什么Nullable(Of T) 首先存在的原因。完全相同的逻辑适用于KeyValuePair。
【讨论】:
Point = Nothing === Point.IsEmpty
您可以将其与空的 KeyValuePair 进行比较,而不是可以为空的类型:
If pair.Equals(New KeyValuePair(Of A, B)) Then Return
【讨论】:
.SingleOrDefault 或FirstOrDefault 使用Linq 时,您没有机会处理Nullable(Of KeyValuePair(Of A, B))。与此特定案例的公认答案相反,此答案确实有效,对我来说似乎很安全。
这就是 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 属性会引发异常。
【讨论】:
这个问题很老了,但是对于一个基本的解决方案:
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 兼容。
【讨论】: