1

何をログに記録し、どこにログを記録するかを制御するために、いくつかの条件を使用してLoggerクラスを拡張しようとしています。2種類のロギング関数があります。

public static class Logger
{
    [Conditional("Logging"), Conditional("VerboseLogging")]
    public static void Log(string msg, string filename)
    {
        // log to file
    }

    [Conditional("VerboseLogging")]
    public static void VerboseLog(string msg, string filename)
    {
        Log(msg, filename); // just defer call to Log(string msg)
    }
}

ただし、次のプログラムを実行する

#define Logging
#define VerboseLogging

static void Main(string[] args)
{
    Logger.Log("Logging", "");
    Logger.VerboseLog("VerboseLogging", "");
}

「VerboseLogging」が欠落している出力「Logging」のみが生成されます。

アプリケーションをデバッグすると、VerboseLoggingは実際に呼び出されますが、は呼び出されませんLog(msg, filename)。デバッガーは、関数呼び出しを飛び越えて関数の最後に移動するだけVerboseLog()です。

Log(string msg)メソッドから条件を削除すると、機能します。

なぜこれが起こるのか、それをどうするのかについて誰かが手がかりを持っていますか?

4

3 に答える 3

3

が定義されていない場合は呼び出されないためLogging、ファイルでも定義する必要があることに注意してVerboseLoggingください。Logger VerboseLogLogLogging

プロジェクト全体の条件付き定義を追加するには、プロジェクトを右クリックして、[プロジェクトのプロパティ]を選択します。次に、[ビルド]タブに移動し、[条件付きコンパイルシンボル]テキストボックスに「Logging、VerboseLogging」と入力します。

于 2009-04-23T13:24:59.617 に答える
0

条件文は逆さまではありませんか?すなわち

[Conditional("Logging")]
public static void Log(string msg, string filename) { }

[Conditional("Logging"), Conditional("VerboseLogging")]
public static void VerboseLog(string msg, string filename) {
    Log(msg, filename); // just defers call to Log()
}
于 2009-04-23T12:49:51.730 に答える
0

本当の助けはありませんが、あなたが投稿したコードは私にとってはここでうまく機能します(.NET 3.5 SP1コンソールアプリケーション)。もちろん、mainでの呼び出しではファイル名パラメーターが提供されないため、filenameパラメーターを削除する必要がありますが、それ以外は、両方の定義で両方のログが得られ、詳細定義を削除すると、ログに記録された「ログ」のみが表示されます。

Occamのかみそりを問題に適用する:投稿したコードは明らかにソースから直接のものではないため(logメソッドの本文がなく、パラメーターが欠落している) 、元のソースで定義を正しくスペルしたと確信していますか?それ以外は、なぜそれがあなたのために働いていないのか分かりません...

于 2009-04-23T13:13:06.447 に答える