2012-02-21 5 views
3

です: - 「オブジェクト参照オブジェクトのインスタンスに設定されていない」Visual Studio 2005の - のコード行がエラーを与える理由を教えてくださいできることは何もチェック

searchstr = IIf(
    Not searchstr Is Nothing 
    AndAlso searchstr.Length > 0, 
    searchstr.Replace("Desig_id", "designation_id"), "") 

はまた、あなたがこれを行うために代替手段を提供することができます検証のタイプ?

+0

searchstrがnullまたは何もないので、その長さをチェックしようとしていて、その内部を置き換えようとしていると思います。 –

+0

http://stackoverflow.com/questions/28478/if-iif-and-ifも参照してください。 http://stackoverflow.com/questions/28377/iif-vs-if。 http://stackoverflow.com/questions/4431326/what-is-the-purpose-of-the-iif-in-vb。その他 – MarkJ

+0

[VB.NET IIFを使用するとNullReferenceExceptionが発生する]の複製が可能です(http://stackoverflow.com/questions/428959/using-vb-net-iif-i-get-nullreferenceexception) – MarkJ

答えて

6

IIf機能は、それがどう考えられるか振る舞いません。 ではない 3進スタイルの演算子a la C++またはC#。これはちょうど普通の関数です。つまり、条件チェックであるは、searchstr.Replaceが評価されてからIIfに渡されます。 searchstrがnullの場合、searchstr.Replace(...)は、まったく呼び出されないと予想しても、NullReferenceExceptionをスローします。

もし演算子はこれをサポートするために、VS2008で追加されていますが、2005年にしている場合、あなたは、If/elseブロックにそれを展開する必要がありました。

If Not searchstr Is Nothing AndAlso searchstr.Length > 0 Then 
    searchstr = searchstr.Replace("Desig_id", "designation_id") 
Else 
    searchstr = "" 
End If 
+3

もっと正確に言えば:それは依存しませんVisual Studioバージョン、それは.NET Frameworkのバージョンです。 .NET 2.0を使用している可能性があります。 – Kamil

+0

よく説明されています。この非常事を学んだ以来、私は(私が.NET 3.5以上のプロジェクトで) 'If()'に遭遇した 'IIf()'をほぼ常に望ましいものに変更しました。 – GregL

+4

@カミル:いいキャッチだけど、それよりも微妙だ!この特定の機能はCLRサポートやクラスライブラリのサポートを必要としないため、VB9以降の言語バージョンをコンパイルするコンパイラを使用することのみに依存します。今VS2010を使用して、.NET 2.0を対象とするプロジェクトでIf演算子を使用できます。 :-) –

1

IIFは、機能ではなく、事業者でありますC#のような? これは、表現の短絡がないことを意味します。あなたは長さや文字列が初期化されているかどうか、両方のisnulloremptyチェック

If string.isnullorempty(searchstr) Then 
    searchstr.Replace("Desig_id","designation_id") 
else 
    searchstr = string.empty 
End if 

として、より良い書き込み、それをあるかもしれない読みやすくするために

searchstr = IIf(
    String.IsNullOrEmpty(searchstr), 
    searchstr.Replace("Desig_id", "designation_id"), "") 
0

: また、あなたのコードは次のようになります。