最初のifステートメントがtrueと評価されるのはなぜですか? 「=」ではなく「is」を使用すると、trueと評価されません。 String.Emptyを "Foo"に置き換えると、trueと評価されません。 String.Emptyと "Foo"の両方が同じタイプのStringを持っているのに、なぜ一方がtrueと評価され、もう一方がtrueと評価されないのですか?
//this evaluates to true
If Nothing = String.Empty Then
End If
//this evaluates to false
If Nothing = "Foo" Then
End If
VB.netには、タイプのデフォルト値はありません。 言語仕様 はセクション2.4.7で述べています:
特別なリテラルはありません。型はなく、型パラメーターを含む型システムのすべての型に変換できます。特定のタイプに変換すると、そのタイプのデフォルト値と同じになります。
したがって、String.Emptyに対してテストすると、Nothingは長さ0の文字列に変換されます。Nothingに対するテストにはIs演算子を使用する必要があり、String.Empty.Equals(Nothing)もfalseを返します。
これは、VBの=
および<>
演算子の特殊なケースです。
言語仕様 はセクション11.14に記載されています。
文字列比較を行う場合、null参照は文字列リテラル ""と同等です。
詳細に興味がある場合は、VB.NETのvbNullString
、String.Empty
、""
およびNothing
の詳細な比較をここに記述しました。
これを試して:
_Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))
_
_=
_演算子は等しい型を強制しませんが、Is
演算子と同様に、文字列オブジェクトの .Equals()
メソッドは強制します。
このトピックに関連して、 "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