23

Resharper がこのコードで「代わりに参照の等価性を確認する」ように提案する理由がわかりません。

if ( typeToTranslate.Equals( typeof(string) ) )
{
    //do something
}

これが優れている理由:

typeToTranslate == typeof(string)

- - - - - - 編集 - - - - - -

これはメソッド スタブです。

protected IType TranslateType(Type typeToTranslate)
{
    if (typeToTranslate == null) throw new ArgumentNullException("typeToTranslate");

    //do some stuff

    if (typeToTranslate.Equals(typeof(string)))
    {
        //do some stuff
    }
    //return some stuff
 }
4

2 に答える 2

26

Object.Equalsは参照等式よりも一般的な種類の等式です。もしそうならx == yx.Equals(y)しかしその逆は必ずしも真ではありません。ただし、MSDNライブラリに記載されているように:

タイプを表すTypeオブジェクトは一意です。つまり、2つのTypeオブジェクト参照は、それらが同じタイプを表す場合にのみ、同じオブジェクトを参照します。これにより、参照の同等性を使用してTypeオブジェクトを比較できます。

ReSharperは、「代わりに参照の同等性をチェックする」検査オプションを「一般的な方法とコードの改善」に分類しているため、ReSharperは、参照の同等性を使用して型を比較す​​るだけで十分であることを通知していると思います。メソッドによって暗示されるより一般的な種類の同等性は必要ありませんEquals(タイプの場合、2つは同等ですが)。

于 2012-11-30T15:28:57.970 に答える
15

System.Type ドキュメントから:

型を表す Type オブジェクトは一意です。つまり、2 つの Type オブジェクト参照は、同じ型を表す場合にのみ、同じオブジェクトを参照します。これにより、参照の等価性を使用して Type オブジェクトを比較できます。

これは、と が同じ参照"string".GetType()typeof(string)返すことを意味します。AppDomain 内の System.String の System.Type オブジェクトのインスタンスは 1 つだけです。

==ReSharper が の代わりに使用する方が「良い」と言っている理由は.Equals()? 私の推測では、より効率的であり、 null の場合 (あなたの場合) をスロー==するリスクがないためです。NullReferenceExceptiontypeToTranslate

于 2012-11-30T15:18:44.853 に答える