7

私がかなり高価な主張をしているとしましょう:

bool IsCompatible(Object x, Object y) { 
  // do expensive stuff here
}

このアサーションを次のようにテストすると、

Debug.Assert(IsCompatible(x,y));

IsCompatibleはリリースビルドで実行されますか?

私の理解では、Debug.Assertは[Conditional( "DEBUG")]としてマークされており、それへの呼び出しはデバッグビルドでのみ発行されます。ただし、メソッド呼び出しには副作用がある可能性があるため、結果がDebug.Assertに渡されるだけでは出力されないため、これによって式がリリースモードで評価されるのを防ぐことはできないと思います。あれは正しいですか?

私がすべきこと:

#if DEBUG
Debug.Assert(IsCompatible(x,y));
#endif

リリースモードでIsCompatibleのコストを支払わないようにするには?

4

1 に答える 1

10

いいえ。

Debug.Assertで飾られてい[Conditional("DEBUG")]ます。

コンパイラがこのメソッドの呼び出しをコンパイルするとDEBUG、呼び出し元のプロジェクトで定義されていない限り、ステートメント全体が削除されます。

于 2012-11-14T17:08:46.950 に答える