如何验证(.NET 2)KeyValuePair
是否有值赋值?KeyValuePair是Nothing
Dim pair as KeyValuePair(Of A, B) = Nothing
if pair.??? Then Return
正如它的结构,它不能与pair Is Nothing
验证。
点结构,由例如。有一个p.IsEmpty
验证。
如何验证(.NET 2)KeyValuePair
是否有值赋值?KeyValuePair是Nothing
Dim pair as KeyValuePair(Of A, B) = Nothing
if pair.??? Then Return
正如它的结构,它不能与pair Is Nothing
验证。
点结构,由例如。有一个p.IsEmpty
验证。
而不是使用“正常”在这里输入 - 这意味着你不能与检测的A
和B
为键和值的默认值的值之间的差额,应使用Nullable(Of KeyValuePair(Of A, B))
。
切实你问完全相同同样的问题作为询问的Integer
变量是否有值,它设置为Nothing
会给它的值为0,你怎么能告诉0和之间的区别“真正的“0?你不能 - 这就是为什么Nullable(Of T)
首先存在。完全相同的逻辑适用于KeyValuePair
。
这就是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
属性将引发异常。
对于性能POW,Nullable类型是否具有带标志的“正常”结构的perfromant? – serhio 2010-07-04 14:42:06
@serhio:不;虽然泛型在技术上会引入一些开销,但这并不重要。 – 2010-07-04 16:29:40
取而代之的是可空类型的,你可以把它比作一个空KeyValuePair:
If pair.Equals(New KeyValuePair(Of A, B)) Then Return
这个问题很老了,但一个基本的解决方案:
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
或兼容。
因此,您确认对于该结构,.NET不提供像它对Point的“空检测”机制?因为'Point = Nothing === Point.IsEmpty' – serhio 2010-07-02 17:02:35
@serhio:没有一般的这样的机制,没有。 – 2010-07-02 17:12:10