27

最初の if ステートメントが true と評価されるのはなぜですか? 「=」の代わりに「is」を使用すると、true と評価されないことはわかっています。String.Empty を「Foo」に置き換えると、true と評価されません。String.Empty と "Foo" の両方が同じ型の String を持っているのに、一方が true と評価され、もう一方が評価されないのはなぜですか?

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

    End If

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

    End If
4

4 に答える 4

23

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

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

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

于 2010-04-13T21:16:39.060 に答える
14

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

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

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


詳細に興味がある場合はvbNullString、 、String.Empty""およびNothingVB.NET の詳細な比較をここに書きました。

于 2015-12-03T15:02:44.883 に答える
3

このトピックに関連して、"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
于 2011-01-11T15:15:01.727 に答える
2

これを試して:

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

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

于 2010-04-13T21:16:47.527 に答える