4

これは私が書いたものです:

if ((lstProperty[i].PropertyIdentifier as string).CompareTo("Name") == 0)

Resharperは私にエラーを出しました(私はReSharperを初めて使用します...私はそれを試しています)そしてそれは私を示唆しています:

  if (((string) lstProperty[i].PropertyIdentifier).CompareTo("Name") == 0)

2番目がNullExceptionが安全なのはなぜですか?私にとって、null値が表示された場合、両方がクラッシュしますか?

4

2 に答える 2

8

キャストを実行できない場合、「as」演算子は null を返しますが、キャストできない場合、C スタイルのキャストは例外をスローします。

これを複数のステートメントに分割することをお勧めします。

string propertyIdentifier = lstProperty[u].PropertyIdentifier as string;
if(propertyIdentifier != null && propertyIdentifier.CompareTo("Name") == 0)
{
    ... your if statement ...
}

Resharper はこれについて不平を言うべきではありません。また、PropertyIdentifier が null であるか文字列でない場合でも、NullReferenceException を受け取ることはありません。

于 2008-11-03T15:54:00.127 に答える
5

どちらの例も同じ状況で成功または失敗し、成功した場合の動作は同じになります。

それらが失敗した場合、結果はわずかに異なります: 2 番目の例は (キャスト時に) 少し早く失敗し、より具体的な例外 ( InvalidCastExceptionvs. NullReferenceException) があります。

主な利点はデバッグです。失敗した場合、最初の例よりも 2 番目の例の方が、失敗した理由についてより多くの情報を得ることができます。具体的には、PropertyIdentifier がnullvs. non-stringの場合、2 番目のケースではわかりますが、最初のケースではわかりません。

また、 にいる場合は、ケースとは別のコード パスでtry/catch非ケースを処理できます。ただし、おそらくこの方法でコーディングするべきではありません。もしそうなら、別のことをしているのです。stringnull

さまざまなケースで次のコードをステップ実行すると、状況を明らかにするのに役立つ場合があります。

var propertyI = lstProperty[i];
var propertyIdentifier = propertyI.PropertyIdentifier;

// pick one of these:
var propertyIdentifierAsString = propertyIdentifier as string;
var propertyIdentifierAsString = (string)propertyIdentifier;

if (propertyIdentifierAsString.CompareTo("Name") == 0)
于 2008-11-03T16:10:24.117 に答える