2

Visual Studio で C# プロジェクトのデバッグ定数を定義すると、アサーションが評価され、失敗したときにメッセージ ボックスが表示されることを確認できます。しかし、アサーションを評価して表示するかどうかを実際に実行時に CLR に決定させるフラグ、属性は何ですか。DEBUG が定義されている場合、アサーション コードは IL で終了しませんか? それとも、アセンブリの DebuggableAttribute のDebuggableAttribute.DebuggingModesフラグが重要なポイントですか? もしそうなら、それのどの列挙値が存在しなければなりませんか? これは内部でどのように機能しますか?

4

2 に答える 2

5

DEBUG プリプロセッサ シンボルを定義せずにコンパイルすると、コンパイルされたコードから Debug.Assert への呼び出しが省略されます。

Debug.Assertのドキュメントを見ると[ConditionalAttribute("DEBUG")]、宣言に含まれていることがわかります。ConditionalAttributeは、コンパイル時にメソッド呼び出しが実際に発行されるかどうかを決定するために使用されます。

条件付き属性が呼び出しが行われないことを意味する場合、引数の評価も省略されます。次に例を示します。

using System;
using System.Diagnostics;

class Test
{
    static void Main()
    {
        Foo(Bar());
    }

    [Conditional("TEST")]
    static void Foo(string x)
    {
        Console.WriteLine("Foo called");
    }

    static string Bar()
    {
        Console.WriteLine("Bar called");
        return "";
    }
}

TEST が定義されると、両方のメソッドが呼び出されます。

c:\Users\Jon> csc Test.cs /d:TEST
c:\Users\Jon> test.exe
Bar called
Foo called

TEST が定義されていない場合、どちらも呼び出されません。

c:\Users\Jon> csc Test.cs /d:TEST
c:\Users\Jon> test.exe
于 2009-02-20T16:12:40.373 に答える
2

System.Diagnostics.Debug クラスのメソッドの ConditionalAttribute と DEBUG が定義されています。

于 2009-02-20T16:12:12.747 に答える