6

私はいくつかのコードを見て、これを見つけました:

Dim TestString As String
...
If TestString <> Nothing And TestString <> "" Then
...
EndIf

両方の条件が同じことをチェックしていますか?

ありがとう

4

3 に答える 3

14

Nothingこれは、実際には文字列である空の文字列 ( )とnullは異なります。""

ただし、チェックは に置き換える必要がありますIf Not String.IsNullOrEmpty(TestString) Then。これにより、正確に何をしているのかが明確になります。

LINQPad でこれをいじってみたところ、少し驚くべきことがわかりました。VB.NET の場合:

Dim s1 as string = Nothing
Dim s2 as string = ""

Console.WriteLine(s1 is Nothing) 'True
Console.WriteLine(s2 is Nothing) 'False

Console.WriteLine(s1 = "") 'True
Console.WriteLine(s2 = "") 'True

Console.WriteLine(string.IsNullOrEmpty(s1)) 'True
Console.WriteLine(string.IsNullOrEmpty(s2)) 'True

C# の場合:

string s1 = null;
string s2 = "";

Console.WriteLine(s1 == null); //True
Console.WriteLine(s2 == null); //False

Console.WriteLine(s1 == ""); //False
Console.WriteLine(s2 == ""); //True

Console.WriteLine(string.IsNullOrEmpty(s1)); //True
Console.WriteLine(string.IsNullOrEmpty(s2)); //True

私はそれをまったく期待していませんでした。VB.Net は、Nothingを空の文字列として扱うようです。私の推測では、古いバージョンの VB との互換性のためです。

String.IsNullOrEmptyこれにより、チェック対象がより明確になり、期待どおりに機能するため、これらの種類のチェックに使用する必要があることがさらに強化されます。

于 2012-07-02T02:30:07.607 に答える
7

それらは同じものをチェックしていますが、異なるものをチェックすることを意図している可能性があります。

If IsNothing(TestString) Then

If TestString = Nothing Then

異なるテストです。最初のテストはめったに使用されません。これは、通常、空でない値があるかどうかだけを本当に知りたいからです。ただし、DB で空の文字列と null 値を異なる方法で処理したり、オプションのパラメーターの使用を検出したりするために使用できます (どちらの場合も、誤って間違った値を入れないようにするために余分な作業が必要になるため、多少壊れやすい)。

与えられた例では、テストは実際には少し冗長で紛らわしいですが、それがテストしたい場合は If String.IsNullOrEmpty(TestString) Then

それについて行く方法です。その "and" が "or" であると想定されていた場合、IsNothing(TestString) を使用したのは理にかなっているかもしれません。

于 2012-07-02T08:27:37.207 に答える
3

はい、VB.NET の定義により、 for 、およびすべてのVB関数を含めること""と同等です。で確認するなど、明示的に違いを気にしない限り。Nothing=<>Is

もちろん、一般的な .NET 関数、特にstr.MethodNull 参照例外で失敗するメソッドを使用すると、違いが見られます。

ところで、OPの抜粋は(ひどく)変換されたC#コードだと思います。

于 2012-07-02T05:12:56.253 に答える