高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

属性ってどこまで出来る?

 C#の面白い仕組みの一つに、属性というのがあります。メソッドやクラスの宣言にくっつけることで、"非推奨"マーク付け(ObsoluteAttribute)したり、メソッドごとにコンパイル条件を指定(ConditionalAttribute)したり、いろんなことが出来ます。
 さて、この"属性"、一体どこまで出来るんでしょう?調べてはいないので分からないですが、SDK事実上何の制限もなしにコードを記述し、新しい方法で実行時の動作を指定できます。とあるように、仕様を変えずして、言語機能を拡張するためにあるような感じです。

とはいえ、実際どこまで出来るんでしょうね。属性を新たに定義するコード(楽天が運営するポータルサイト : 【インフォシーク】InfoseekのSylpheenなど、カスタム属性を作って使っています。同サイトで作り方&使い方も掲載されてます)を見た限りでは、一般のクラスを作るのと同じやりかたですし、それほど大きな拡張が出来るのかどうかは分からないですが…。


 話は少し変わってPerlには、Switch.pmと言うモジュールがあるんです。これを使うと、Perlの言語仕様にはないswitch文が使えるようになるというモジュールです(おんぷむらのCGIでも使用しています)。
C#の属性も、やろうと思えばそれに匹敵するくらいのことが出来るんでしょうかねえ?文面を見た限りだとそういう風にも読めるのですが…。そうすれば、C#2.0で実装するらしいGenerics*1なども、属性だけで片づけてしまうとか、出来るのでしょうか?SharpDevelopを使ってる限りC#2.0の機能は当分使えそうにないですし(そもそもその環境が世間一般になじむまでにいくらかかるか分からないし)、出来れば使って(作って?)みたいですね。
staticメソッドばっかりの、インスタンス化禁止クラスの宣言なんかも、これで出来たりして(今だとsealedクラスとして宣言し、コンストラクタをprivateにするくらいしか方法がないように見えます。それだと若干面倒ですし)。

*1:J2SE1.5で実装された機能、ArrayListなどに格納する型を限定する…で合ってたかな?