2010-07-02 60 views
3

如何验证(.NET 2)KeyValuePair是否有值赋值?KeyValuePair是Nothing

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

if pair.??? Then Return 

正如它的结构,它不能pair Is Nothing验证。

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

回答

12

而不是使用“正常”在这里输入 - 这意味着你不能与检测的AB为键和值的默认值的值之间的差额,应使用Nullable(Of KeyValuePair(Of A, B))

切实你问完全相同同样的问题作为询问的Integer变量是否有值,它设置为Nothing会给它的值为0,你怎么能告诉0和之间的区别“真正的“0?你不能 - 这就是为什么Nullable(Of T)首先存在。完全相同的逻辑适用于KeyValuePair

+1

因此,您确认对于该结构,.NET不提供像它对Point的“空检测”机制?因为'Point = Nothing === Point.IsEmpty' – serhio 2010-07-02 17:02:35

+0

@serhio:没有一般的这样的机制,没有。 – 2010-07-02 17:12:10

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属性。此外,如果HasValue为假,则访问该结构的Value属性将引发异常。

+0

对于性能POW,Nullable类型是否具有带标志的“正常”结构的perfromant? – serhio 2010-07-04 14:42:06

+0

@serhio:不;虽然泛型在技术上会引入一些开销,但这并不重要。 – 2010-07-04 16:29:40

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需要与= Nothing或兼容。