文字列に等しいものはありません。
-
01-10-2019 - |
質問
混合コードプロジェクト(VBおよびC#)では、このような古い視覚的な基本コードをデバッグしていました。
If Request.Params("xxx") <> "" Then
'do something
私はこれをリクエストとしてバグだと考えました。パラムはそうかもしれません null
, 、その場合、声明は虚偽になり、それは考えではありませんでした。
ので、私は考えました。私はちょうど - もう一度 - そのVBの Nothing
およびc# 's null
同じものではありません Nothing
と同じではありません null
. 。実際には:
if(String.Empty == null) // in C# this is always false (correct)
If String.Empty = Nothing Then ' in VB this is always true (????)
これはどのように可能ですか?これは後方互換性の問題ですか?
解決
Nothing
文字列のVBで特別な意味があります。文字列参照がnullかどうかをテストするには、次のことが必要です。
If value Is Nothing
から VB比較演算子のドキュメント:
数値比較は0として何も扱われません。文字列比較は「」(空の文字列)として何も扱いません。
これは、VB6との後方互換性のためだけのものだと思います - 私がVB開発者であれば、それは私が満足するものではありません。
フォームの比較
If value = Nothing
通話にコンパイルされます Microsoft.VisualBasic.CompilerServices.Operators.CompareString
1つのオペランドが無効で、もう1つのオペランドが空の場合、0(つまり等しい)を返します。
他のヒント
VB6では、文字列変数のデフォルト値は空の文字列でした。このような動作に依存するVB6プログラマーは、INT変数のデフォルトゼロの初期化に依存するCプログラマーほど「悪い」ものではありません。両方の動作は、言語の一部として指定されました。
さらに、COM(VB6の以前のバージョンの基礎となるフレームワーク)では、文字列への参照が作成されたときはいつでも、誰かが手動でそれを処分する必要があります。最も一般的に使用される文字列は空の文字列であるため、多くのcomメソッドは、nullポインターが空の文字列に相当するものとして明示的に文書化されています。これは、空の文字列を返す関数または値パラメーターとして渡すか、または返品する関数が、何も割り当てることなくヌルポインターを渡すだけであることを意味します。ヌルポインターの受信者は、何も脱アロッカ化する必要はありません。
.NETのオブジェクトは明示的な取引を必要としないため、null参照を空の文字列と見なすパフォーマンスの利点はもはや適用されなくなります。それにもかかわらず、COMメソッドの動作と同様の動作を期待する可能性のあるコードから呼び出される方法は、NULL文字列の参照が空の文字列と同じであると見なすことがよくあります。
あなたが欲しい
If Not String.IsNullOrEmpty(Request.Params("xxx") Then
...
End If
または
if (!String.IsNullOrEmpty(Request.Params("xxx")) {
...
}