2010-07-02 86 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或兼容。