115

Resharper がこれを回すように提案していることに気付きました。

if (myObj.myProp is MyType)
{
   ...
}

これに:

var myObjRef = myObj.myProp as MyType;
if (myObjRef != null)
{
   ...
}

なぜこの変更を提案するのでしょうか? 私はResharperが最適化の変更とコード削減の変更を提案することに慣れていますが、これは私の単一のステートメントを2行に変えたいと思っているように感じます.

MSDNによると:

is は、次の両方の条件が満たされる場合に true と評価されます。

がヌルではありません。式はtypeにキャストできます。つまり、フォームのキャスト式は、(type)(expression)例外をスローせずに完了します。

nullチェック用に別のローカル変数を明示的に作成する必要なしに、1行だけでそれを読み間違えていますか、それともisまったく同じチェックをしていませんか?

4

7 に答える 7

169

キャストが一人だから。これを比較してください:

if (myObj.myProp is MyType) // cast #1
{
    var myObjRef = (MyType)myObj.myProp; // needs to be cast a second time
                                         // before using it as a MyType
    ...
}

これに:

var myObjRef = myObj.myProp as MyType; // only one cast
if (myObjRef != null)
{
    // myObjRef is already MyType and doesn't need to be cast again
    ...
}

C# 7.0 では、パターン マッチングを使用したよりコンパクトな構文がサポートされています。

if (myObj.myProp is MyType myObjRef)
{
    ...
}
于 2012-11-15T20:40:32.357 に答える
3

私には、これは、そのタイプになるかどうかに依存しているように見えます。オブジェクトがほとんどの場合そのタイプである場合は、前もってキャストを行う方が確かに効率的です。そのタイプがたまにしかない場合は、最初にisで確認する方が最適な場合があります。

ローカル変数を作成するコストは、型チェックのコストと比較してごくわずかです。

読みやすさと範囲は、私にとって通常、より重要な要素です。私はReSharperに同意せず、その理由だけで「is」演算子を使用します。これが真のボトルネックである場合は、後で最適化してください。

myObj.myProp is MyType(この関数で使用しているのは1回だけだと思います)

于 2012-11-15T20:46:03.833 に答える
1

これは、myObjRef である myObj.myProp の厳密に型指定されたバージョンを作成することだと言えます。これは、ブロック内でこの値を参照する場合と、キャストを行う必要がある場合に使用する必要があります。

たとえば、次のようになります。

myObjRef.SomeProperty

これよりも優れています:

((MyType)myObj.myProp).SomeProperty
于 2012-11-15T20:38:17.910 に答える
0

2 番目の変更も提案する必要があります。

(MyType)myObj.myProp

の中へ

myObjRef

これにより、元のコードと比較して、プロパティへのアクセスとキャストが節約されます。しかし、それは に変更isした後にのみ可能asです。

于 2012-11-15T20:35:52.787 に答える