5

メソッドの先頭で入力パラメーターを検証するためにSystem.Functionメソッドを使用しているコードです(次の抜粋されたコード例を参照してください)。Debug.Assert(..)

public class TestClass : IInterface
{
}

public class Verifier
  {
     public static void Verify(IInterface objectToVerify)
     {
        Debug.Assert((objectToVerify is TestClass), "Passed object must be type of TestClass");

        // ReSharper (Version 7.1.1) marks here "Expression is always false
        if (!(objectToVerify is TestClass))
        {
           return;
        }

        // do something ...
     }
  }

ステートメントをコメントアウトするとDebug.Assert、ReSharper の警告が消えます。私の意見では、ReSharper はこのDebug.Assertステートメントを無視する必要があります。これは、Debug.Assertステートメントが満たされない場合も、その下のコードが実行されるためです (たとえば、リリース モードで)。

あなたの意見は何ですか?または、代替の実装のアイデアはありますか?

4

5 に答える 5

9

いいえ、私は resharper が間違っていると思います。その理由は簡単です 。Resharper は、実際にはそうではないことがわかっているのに、コードに到達できないと言います。

リリース ビルドは常にそのコードを実行し、ダイアログで [無視] をクリックするとデバッグ ビルドがヒットします。

assert の後に続行することがバグであるかどうかは問題ではありません。到達不能なコードではありません。

于 2013-05-30T08:33:25.210 に答える
2

ReSharperは、がそうでないDebug.Assert()場合に実行を停止することを知っているほど賢いです。したがって、ステートメント内の式は実際には常にです(そうでない場合、ステートメントは最初から到達しません)。objectToVerifyTestClassiffalseif

次のように書くことで、警告を回避できます。

public static void Verify(IInterface objectToVerify)
{
    if (!(objectToVerify is TestClass))
    {
        Debug.Assert(false, "Passed object must be type of TestClass");
        return;
    }

    // do something ...
}
于 2013-01-31T14:43:38.250 に答える
1

古い質問ですが、私はこの問題に遭遇し、HeuristicUnreachableCodeを切り替えることで (表面的に) 解決しました:

Debug.Assert(false, "type/fieldNum not processed");
// ReSharper disable HeuristicUnreachableCode
return null;
// ReSharper restore HeuristicUnreachableCode
于 2016-12-08T09:07:09.353 に答える
0

Debug.Assert私は「この表現falseは決して起こり得ない」と読んだ。Resharper の警告は、その使用と一致しています。それは単にあなたの主張を信じています。thenステートメントの一部が実行されると、プログラムにバグがあります。

ただし、パブリック API のデバッグ時にパラメーターの検証に使用します。私はそのためにアサーションを使用しません。その場合は例外をスローし、if(...)return.

于 2013-01-31T14:49:03.867 に答える
0

Code Contractsを使用できます。

コードは次のようになります -

  public class Verifier
  {
     public static void Verify(IInterface objectToVerify)
     {
        Contract.Requires<ArgumentException>((objectToVerify is TestClass), "Passed object must be type of TestClass");

        // do something ...
     }
  }

デバッグおよびリリース モードで動作します。詳細はこちら

于 2013-01-31T14:55:00.883 に答える