私はいくつかのコードを見て、これを見つけました:
Dim TestString As String
...
If TestString <> Nothing And TestString <> "" Then
...
EndIf
両方の条件が同じことをチェックしていますか?
ありがとう
私はいくつかのコードを見て、これを見つけました:
Dim TestString As String
...
If TestString <> Nothing And TestString <> "" Then
...
EndIf
両方の条件が同じことをチェックしていますか?
ありがとう
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
これにより、チェック対象がより明確になり、期待どおりに機能するため、これらの種類のチェックに使用する必要があることがさらに強化されます。
それらは同じものをチェックしていますが、異なるものをチェックすることを意図している可能性があります。
If IsNothing(TestString) Then
と
If TestString = Nothing Then
異なるテストです。最初のテストはめったに使用されません。これは、通常、空でない値があるかどうかだけを本当に知りたいからです。ただし、DB で空の文字列と null 値を異なる方法で処理したり、オプションのパラメーターの使用を検出したりするために使用できます (どちらの場合も、誤って間違った値を入れないようにするために余分な作業が必要になるため、多少壊れやすい)。
与えられた例では、テストは実際には少し冗長で紛らわしいですが、それがテストしたい場合は If String.IsNullOrEmpty(TestString) Then
それについて行く方法です。その "and" が "or" であると想定されていた場合、IsNothing(TestString) を使用したのは理にかなっているかもしれません。
はい、VB.NET の定義により、 for 、およびすべてのVB関数を含めること""
と同等です。で確認するなど、明示的に違いを気にしない限り。Nothing
=
<>
Is
もちろん、一般的な .NET 関数、特にstr.Method
Null 参照例外で失敗するメソッドを使用すると、違いが見られます。
ところで、OPの抜粋は(ひどく)変換されたC#コードだと思います。