27

次の例を見てください。

public void Foo()
{
    //Code...

    Debug.Assert(ExpensiveTest());

    //Code...
}

Debug.Assertリリースモードでコンパイルすると、メソッドはどうなりますか?ExpensiveTest()まだ実行されますか?そうでない場合、それはどのように機能しますか(何も評価しないように設定できるマクロではないため)?それが実行される場合、それはデバッグアサーションの目的を無効にしませんか?

4

4 に答える 4

37

リリースモードでコンパイルすると、Debug.Assertメソッドはどうなりますか?

リリース構成で条件付きコンパイルシンボルが定義されてExpensiveTestいない場合は、完全に削除されます(への呼び出しを含む)。DEBUG

ドキュメントを見ると、宣言は以下を使用しています[ConditionalAttribute("DEBUG")]

[ConditionalAttribute("DEBUG")]
public static void Assert(
    bool condition
)

ConditionalAttribute条件付きコンパイルに使用されます。詳細については、C#4仕様のセクション17.4.2とともに、条件付きコンパイルに関するBartdeSmetのブログ投稿を参照してください。

于 2012-12-13T09:17:33.457 に答える
7

マネージコードのアサーション-MSDN

VisualBasicおよびVisualC#では、System.Diagnostics名前空間にあるDebugまたはTraceのいずれかからAssertメソッドを使用できます。 デバッグクラスメソッドはプログラムのリリースバージョンに含まれていないため、リリースコードのサイズが大きくなったり速度が低下したりすることはありません。

また、同じリンクから:

コードのリリースバージョンを作成すると、Debug.Assertメソッドの呼び出しが消えることに注意してください。これは、バランスをチェックする呼び出しがリリースバージョンで消えることを意味します。この問題を解決するには、Debug.AssertをTrace.Assertに置き換える必要があります。これは、リリースバージョンでは消えません。

于 2012-12-13T09:17:51.360 に答える
5

Debug.Assertメソッド(ブール値) によると、メソッドDebugはデバッグビルドでのみコンパイルされます。

したがって、正しいリリースビルドをビルドすると(詳細はメニュー項目Debug/Configuration Managerを参照)、このメソッド呼び出しは削除されます。

于 2012-12-13T09:17:19.493 に答える
1

Q. C#では、Debug.Assertテストはリリースモードで実行されますか?

答えはいいえだ。" Microsoftサポートから:Visual C#でトレースおよびデバッグする方法

TraceクラスとDebugクラスは、別々に使用することも、同じアプリケーションで一緒に使用することもできます。デバッグソリューション構成プロジェクトでは、トレース出力とデバッグ出力の両方がアクティブです。プロジェクトは、これらのクラスの両方からすべてのリスナー オブジェクトへの出力を生成します。ただし、リリースソリューション構成プロジェクトは、Traceクラスからの出力のみを生成します。リリースソリューション構成プロジェクトは、Debugクラスメソッドの呼び出しをすべて無視します。

Debug.Assert()特に、最後の文は、ステートメント(および他のDebugクラスメソッドの呼び出し)がリリースビルドで無視されることを明確にしています。

于 2015-08-25T17:46:56.757 に答える