|
■No16202 (ネタ好き さん) に返信
属性は、一般的に、リフレクションによって使われます。 が、一部の属性はリフレクション以外でも使われます。 代表的なのが Obsoletes とか InternalsVisibleTo とか。コンパイラやリンカによって解釈される属性ですね。 で、これらの属性の利用者がコンパイラやリンカであると限定するならば、必ずしも ObsoletesAttribute クラスとして .NET Framework に含まれる必要は無いわけです。 #pragma obsoletes みたいな形で、コンパイラにだけ解釈できるものであっても困らない。 もちろん、利用者をコンパイラに限定する必要は必ずしも無いわけですが。限定した場合という仮定のもとでの話です。
さて、ちょっと視点を変えてみます。 ソースコードと、それをコンパイルしたバイナリの違いは何でしょう? まぁいろいろ挙げることはできると思いますが、ここでは「表現方法の違い」ということにしてみましょう。 要するに、書いてある内容は同じであって、その書き方が違うだけ、ということです。
何が言いたいかというと…書いてある内容が同じであれば、バイナリに対してだけでなく、ソースコードに対してもリフレクションができていいんじゃないか? ということです。 現実には、ソースコードパーサを書かないと不可能なわけですが。 コンパイルされたバイナリも、IL という中間言語で書かれたコードだと思えば、コンパイラがソースコードをパースすることと、.NET Framework ランタイム ライブラリが IL をパースすること(リフレクション)は同じことだと考えられます。
仮に ObsoletesAttribute でなく #pragma obsoletes のような形にしてしまって、コンパイル後のバイナリには属性情報が残らないとすれば、ソースコードとバイナリの内容が同じではなくなってしまいます。 コンパイルしていなくてもプログラムがプログラムであることに変わりは無く、コンパイラが ObsoletesAttribute を拾い上げて警告をだすことは、ソースコードに対してリフレクションをしているのだ、と考えると、何か面白いアイデアが出てくるかな? と。
ただそれだけの話です。
|