2010-04-13 78 views
24

爲什麼第一個if語句的結果爲true?我知道如果我使用「是」而不是「=」,那麼它不會評估爲真。如果我用「Foo」替換String.Empty,它不會計算爲true。 String.Empty和「Foo」都具有相同類型的字符串,那麼爲什麼一個評估爲真,另一個不是?Nothing = String.Empty(爲什麼它們相等?)

//this evaluates to true 
    If Nothing = String.Empty Then 

    End If 

    //this evaluates to false 
    If Nothing = "Foo" Then 

    End If 
+0

您是否在使用'.Equals()'方法進行比較? – Amber 2010-04-13 21:14:44

+0

我添加了一個代碼片段。實際上我並不需要在null和空字符串之間進行比較,我只是很好奇爲什麼該語句的計算結果爲true。 – 2010-04-13 21:25:44

回答

21

VB.net中沒有什麼是類型的默認值。 language spec在2.4.7節中說:

沒有什麼是特殊的文字;它沒有類型,可以轉換爲類型系統中的所有類型,包括類型參數。轉換爲特定類型時,它與該類型的默認值相同。

所以,當你測試針對的String.Empty,沒有什麼是轉換爲字符串,其長度爲0的是運營商應當用於對沒有測試,String.Empty.Equals(沒有)會也返回false。

+0

您是否知道在比較時自動將Nothing轉換爲字符串的原因?這有什麼好處? – 2010-04-13 21:24:29

+8

將=運算符與字符串一起使用時,VB.NET使用StrCmp而不是op_Equality。我推測這是出於向後兼容性的原因。 – 2010-04-13 21:51:48

+1

她的意思是說:VB.NET Nothing =默認(T)在C#中,而不是NULL – 2013-01-18 05:54:01

2

嘗試這種情況:

Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing)) 

=操作者不執行等於類型,而字符串對象的.Equals()方法不一樣,在操作者Is

2

與此主題相關,如果使用初始化爲「nothing」的字符串變量指定給SqlParameter的屬性「value」,該參數將被忽略,不包含在發送到服務器的命令中,並且缺少參數錯誤被拋出。 如果你用string.empty初始化那個變量,一切都很好。

//This doesn't work 
Dim myString as String = nothing 
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString 

//This works  
Dim myString as String = string.empty 
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString 
+0

就在我認爲我理解VB.NET時... – 2013-11-18 19:05:59

+2

將值設置爲DBNull.value而不是Nothing – 2014-01-29 21:49:57

+0

它指出了一個問題,即如果外部庫不是用VB編寫的,庫的作者可能不知道VB中沒有任何內容和空字符串之間的歧義。因此,當它用於VB代碼時,用戶必須小心地傳遞任何內容或空字符串。 – Gqqnbig 2016-09-15 17:29:09

4

這是VB的=<>運營商的特例。

在第11.14 Language Specification狀態:

當執行字符串比較,空引用等同於字符串「」。

相關問題