2

Iif() の使用に関する多くの投稿/記事を見てきました。これはすべて、C/C#/C++ などの条件演算子のように IIf() を使用しようとしたときに始まりました。

私が正確にやろうとしたことは、次の投稿のこれの行に正確にありました。

VB.NET IIF を使用すると NullReferenceException が発生します

ただし、実装したソリューションは、次の msdn サイトから借用したものです。

http://msdn.microsoft.com/en-us/library/27ydhh0d%28v=vs.80%29.aspx

その後、vb.net の If() メソッドについて学びました。

そのため、最終的には、目的を達成するために適切な値 (リフレクションを使用) を返す関数を作成しました。しかし、そのメソッド (私が書いたもの) は例外をスローしませんでした。実際、関数内の型が null 可能かどうかを確認できました。

Function ReturnValue(ByVal MyType As SomeType, ByVal PropertyName as String) As Object
    If MyType Is Nothing Then Return String.Empty
    Dim arrPropInfo As PropertyInfo() = MyType.GetType().GetProperties()
    Return arrPropInfo.Where(Function(x) x.Name = PropertyName).Item(0).GetValue(MyType, Nothing)
End Function

私の質問は、そのようなエラーをスローするために Iif() 内に書かれたものはありますか? - NullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()

それとも、ここでもっと大きな何かが働いているのでしょうか? では、引数リスト内の何かが null の場合にエラーをスローする iif のような関数を書きたい場合、上記の方法が唯一の方法であるとします。

4

3 に答える 3

8

違いは、?:If()演算子であることです。 IIf()演算子ではありません。それは普通の古い機能です。自分で実装することもできます:

Public Shared Function IIf(ByVal Expression As Boolean, ByVal TruePart As Object, ByVal FalsePart As Object) As Object
    If Expression Then Return TruePart Else Return FalsePart
End Function

つまり、関数に渡されるすべての引数は、他の関数と同様に、関数が呼び出される前に評価される必要があります。例外をスローする IIF() の内部には何もありません。これは、関数に渡された引数を評価する通常のプロセスです。

また、関数に null/Nothing を渡してもまったく問題ないことに注意する必要があります。渡した式に評価できない null 参照があったため、コードで例外が発生しました。たとえば、null 文字列変数の .Length プロパティを使用しようとした場合などです。

一方、If() 演算子にはこの問題はありません。これは、次のとおりです。 演算子 さらに、短絡評価を利用する演算子であるため、返された式のみを評価する必要があります。If() には、タイプ セーフであるという優れた利点もありますが、必要に応じて、ジェネリック IIF(Of T)() 関数でもタイプ セーフを複製できます。

于 2011-03-28T03:32:26.323 に答える
0

IIF は C++ とは異なります:? 少なくとも 1 つの重要な方法で、常に両方の式を評価するため、次のようなことはできませんIIF(X is nothing,DefaultValue,X.Value)。X が何もない場合でも X.Value を評価するため、null 参照例外がスローされます。

IIF は、演算子ではなく関数であるため、そのように機能します

IIF をどのように使用していたかについてのコードを提供していないので、私は推測しています。私が今言ったことは、あなたが MSDN に提供したリンクからの最初のコメントであるため、おそらくこれを既に知っているか、これはあなたの質問ではありません.

質問が本当に例外をスローしたい場合は、上記のコードを使用する必要がありますが、代わりにスローとArgumentNullExceptionを使用して、どの引数が null であるかを指定できます。

于 2011-03-28T03:28:25.067 に答える
0

ByRef 引数を追加して、関数で実際に例外が発生したかどうかを示すことができます。このようにして、関数で発生した例外をキャッチする必要がなくなります。もちろん、その関数に Try...Catch ステートメントを追加する必要があります。

于 2011-03-28T03:31:56.113 に答える