C# 仕様にはプリプロセッサと基本的なディレクティブ (#define、#if など) が含まれていますが、言語には C/C++ などの言語に見られるような柔軟なプリプロセッサはありません。このような柔軟なプリプロセッサの欠如は、Anders Hejlsberg による設計上の決定であったと思います (ただし、残念ながら、これについての言及は現在見つかりません)。経験上、これは確かに良い決断でした。C/C++ をたくさん使っていた頃には、非常にひどい保守不可能なマクロが作成されていたからです。
とはいえ、もう少し柔軟なプリプロセッサが役立つと思われるシナリオはたくさんあります。次のようなコードは、いくつかの単純なプリプロセッサ ディレクティブによって改善される可能性があります。
public string MyProperty
{
get { return _myProperty; }
set
{
if (value != _myProperty)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
// This line above could be improved by replacing the literal string with
// a pre-processor directive like "#Property", which could be translated
// to the string value "MyProperty" This new notify call would be as follows:
// NotifyPropertyChanged(#Property);
}
}
}
このような非常に単純なケースを処理するプリプロセッサを作成するのは良い考えでしょうか? Steve McConnell はCode Complete (p208)で次のように書いています。
独自のプリプロセッサを作成 する 言語にプリプロセッサが含まれていない場合、プリプロセッサを作成するのはかなり簡単です...
私は引き裂かれています。このような柔軟なプリプロセッサを C# から除外することは、設計上の決定でした。ただし、私が非常に尊敬している著者は、状況によっては問題ないかもしれないと述べています。
C# プリプロセッサをビルドする必要がありますか? 私がやりたい簡単なことをするものはありますか?