如何驗證(.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