web-dev-qa-db-ja.com

Nothing = String.Empty(これらが等しいのはなぜですか?)

最初の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
26

VB.netには、タイプのデフォルト値はありません。 言語仕様 はセクション2.4.7で述べています:

特別なリテラルはありません。型はなく、型パラメーターを含む型システムのすべての型に変換できます。特定のタイプに変換すると、そのタイプのデフォルト値と同じになります。

したがって、String.Emptyに対してテストすると、Nothingは長さ0の文字列に変換されます。Nothingに対するテストにはIs演算子を使用する必要があり、String.Empty.Equals(Nothing)もfalseを返します。

20

これは、VBの=および<>演算子の特殊なケースです。

言語仕様 はセクション11.14に記載されています。

文字列比較を行う場合、null参照は文字列リテラル ""と同等です。


詳細に興味がある場合は、VB.NETのvbNullStringString.Empty""およびNothingの詳細な比較をここに記述しました。

10
Heinzi

これを試して:

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

_=_演算子は等しい型を強制しませんが、Is演算子と同様に、文字列オブジェクトの .Equals() メソッドは強制します。

2
Amber

このトピックに関連して、 "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
2
DanielRuzo