デバッグ時のみ出力したり関数実行したりする

前回の記事でConditional属性について学んだので早速デバッグ用の関数を作ってみました。

-- lib/debug.cs --

using System;
using System.Diagnostics;

namespace MyLib
{
    public static class debug
    {
        // デバッグ改行出力関数
        [Conditional("DEBUG")]
        public static void wl (object s) {
            Console.WriteLine(s);
        }
        [Conditional("DEBUG")]
        public static void wl (string s, params object[] obj) {
            var sout = string.Format(s,obj);
            Console.WriteLine(sout);
        }
        
        // デバッグ出力関数
        [Conditional("DEBUG")]
        public static void w (object s) {
            Console.Write(s);
        }
        [Conditional("DEBUG")]
        public static void w (string s, params object[] obj) {
            var sout = string.Format(s,obj);
            Console.Write(sout);
        }
        
        // デバッグ時のみ有効な関数を実行
        [Conditional("DEBUG")]
        public static void f (Action func) {
            func();
        }
    }
}
-- main.cs --

using System;
using MyLib;

class Program {
    static void Main() {
        Console.WriteLine("foo1");
        
        // DEBUG時のみ出力
        debug.wl("foo2");
        
        Console.WriteLine("foo3");
        
        // DEBUG時のみ実行される処理
        debug.f(() => {
            Console.WriteLine("foo4-1");
            Console.WriteLine("foo4-2");
            Console.WriteLine("foo4-3");
        });
        
        Console.WriteLine("foo5");
    }
}

DEBUG有り

$ csc /define:DEBUG main.cs lib\*.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.


$ main
foo1
foo2
foo3
foo4-1
foo4-2
foo4-3
foo5

DEBUG無し

$ csc main.cs lib\*.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.


$ main
foo1
foo3
foo5

うまくいってますね。今後使って行きたいと思います。