2

C#で特定の関数呼び出しをno-opsに置き換える良い方法を(リフレクションまたは特別な属性を介して)知っている人はいますか?

基本的に、私がやろうとしていることはこのようなものです

#ifdef DEBUG

StopWatch.start();

#endif

DoSomething();

#ifdef DEBUG

StopWatch.stop();
Log.TimingInfo(StopWatch);

#endif

私のコードのいたるところに多くのifdefをまき散らすことなく。これ (私の StopWatch クラス) を null オブジェクト パターンに置き換えて、条件付きで null オブジェクトを割り当てることもできますが、コード内で厳密に no-op と比較すると、これはまだ理想的ではありません。ここではコード パスの長さが非常に重要です。タイミングの結果を収集しようとしていないときは、op がまったくないため、読みやすさをいくらか犠牲にしたいと思います。

C# で StopWatch クラスまたはメソッドにタグを付けて、コンパイラによって評価されたときにコードを出力しないようにする方法があるかどうかは誰にもわかりませんか?

4

3 に答える 3

11

[Conditional("DEBUG")]次のような属性でメソッドに注釈を付けることができます。

class StopWatch
{
    [Conditional("DEBUG")]
    public void Start() { }

    [Conditional("DEBUG")]
    public void Stop() { }
}

これは、 /#ifdef DEBUGへの呼び出しと同じ効果があります。注意点:条件付きメソッドはvoidを返す必要があります。他にもいくつかの制限があります。詳細については、ConditonalAttributeのドキュメントを参照してください。StartStop

于 2010-11-12T20:42:04.500 に答える
2

C# 3.0 以降を使用している場合は、部分メソッドを調べることができます。

http://bartdesmet.net/blogs/bart/archive/2007/07/28/c-3-0-partial-methods-what-why-and-how.aspx

于 2010-11-12T20:37:45.477 に答える
0

このようなクラスを使用できます。これには、Visual Studio の出力ウィンドウへのログも含まれます。

public static class TimerCalls
{
    private static Dictionary _Stopwatches = new Dictionary();

    [ConditionalAttribute("TIMERS")]
    public static void StartStopwatch(string key)
    {
        if (_Stopwatches.ContainsKey(key)) //Stopwatch already running
            return;

        _Stopwatches.Add(key, Stopwatch.StartNew());
    }

    [ConditionalAttribute("TIMERS")]
    public static void StopStopwatch(string key)
    {
        if (!_Stopwatches.ContainsKey(key))//No such stopwatch currently
            return;

        var watch = _Stopwatches[key];
        watch.Stop();
        _Stopwatches.Remove(key);
        Debug.WriteLine(String.Format("Timer: {0}, {1}ms ---- {2}", key,
            watch.Elapsed.TotalMilliseconds, DateTime.Now));
    }
}

そして「使い方」:

TimerCalls.StartStopwatch("Operations");
// many operations..
TimerCalls.StopStopwatch("Operations");// Timer: Operations, 508ms ---- 27.06.2012 11:41:06

これは、Visual Studio プロジェクト プロパティまたは #define を使用してプログラムに追加できる条件付きシンボル TIMERS を使用します (クラス作成時間のペナルティに対処する必要があることを確認してください)。詳細については、私のブログ投稿をご覧ください。しかし、それはロシア語です。

于 2012-06-28T06:45:57.647 に答える