Conditional属性

属性 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C


属性というものが出てきました。

クラスやメソッド等に追加情報を与えることができる機能とのことです。

「百聞は一実装にしかず」という諺もある通り、手を動かしてみましょう。

色々な属性があるみたいですが、まずはシンプルなConditional属性について学んでみましょう。

Conditional属性とはdefineで定義されたシンボルが存在しているときだけ有効な処理を定義することができます。

using System;
using System.Diagnostics;

public static class Class {
    // DEBUGシンボルが定義されている場合のみ有効なメソッド
    [Conditional("DEBUG")]
    public static void debugOutput (int i) {
        Console.WriteLine(i);
    }
}

class Program {
    static void Main() {
        Class.debugOutput(100);
    }
}

さてこれを、以下のようにコマンドラインオプションに/defineを追加してコンパイルします。

$ csc /define:DEBUG main.cs

そして実行すると

$ main
100

と表示されます。では次に/define無しコンパイルしてみます。

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


$ main

コンパイルエラーも出ないし、実行しても何も出力されません。

このようにConditional属性を使うと、関数の存在そのものが消えてなくなります。

これは非常に強力で便利な機能で、もし同じような処理をConditional属性を利用せずに書こうと思ったら、

using System;

public static class Class {
#if DEBUG
    public static void debugOutput (int i) {
        Console.WriteLine(i);
    }
#endif
}

class Program {
    static void Main() {
#if DEBUG
        Class.debugOutput(100);
#endif
    }
}

このように定義時、呼び出し時全てにおいてわざわざ#if DEBUG〜#endifを書かなければなりません。

というわけで今後この機能を使ってデバッグ用の処理を書いていきたいと思います。

属性については他にも標準で定義されているものが色々とあるみたいなのでまた追々学んでいきたいとおもいます。