IMO #if と #define を区別することが重要です。どちらも有用であり、どちらも使いすぎる可能性があります。私の経験では、#define は #if よりも多用される傾向にあります。
私は C および C++ プログラミングに 10 年以上費やしました。私が取り組んだプロジェクト (DOS / Unix / Macintosh / Windows 用の市販ソフトウェア) では、主にコードの移植性の問題に対処するために #if と #define を使用しました。
私は C++ / MFC で作業するのに十分な時間を費やし、#define が過度に使用されている場合に嫌悪することを学びました。これは 1996 年頃の MFC の場合であると私は信じています。
その後、Java プロジェクトに 7 年以上携わりました。プリプロセッサを見逃したとは言えません (ただし、当時 Java になかった列挙型やテンプレート / ジェネリックなどは間違いなく見逃していました)。
私は 2003 年から C# で作業しています。デバッグ ビルドには #if と [Conditional("DEBUG")] を多用していますが、#if はより便利で、同じことを行うためのわずかに効率的な方法です。私たちが Java で行ったこと。
前進するために、Silverlight 用のコア エンジンの準備を開始しました。私たちが行っていることはすべて #if がなくても実行できますが、#if を使用すると作業が減ります。つまり、顧客が求めている機能を追加するためにより多くの時間を費やすことができます。たとえば、コア エンジンに格納するシステム カラーをカプセル化する値クラスがあります。以下は、コードの最初の数行です。System.Drawing.Color と System.Windows.Media.Color は似ているため、上部の #define により、コードを複製することなく、通常の .NET と Silverlight で多くの機能を利用できます。
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
#if SILVERLIGHT
using SystemColor = System.Windows.Media.Color;
#else
using SystemColor = System.Drawing.Color;
#endif
namespace SpreadsheetGear.Drawing
{
/// <summary>
/// Represents a Color in the SpreadsheetGear API and provides implicit conversion operators to and from System.Drawing.Color and / or System.Windows.Media.Color.
/// </summary>
public struct Color
{
public override string ToString()
{
//return string.Format("Color({0}, {1}, {2})", R, G, B);
return _color.ToString();
}
public override bool Equals(object obj)
{
return (obj is Color && (this == (Color)obj))
|| (obj is SystemColor && (_color == (SystemColor)obj));
}
...
私にとっての結論は、過度に使用される可能性のある多くの言語機能があるということですが、これは、これらの機能を除外したり、それらの使用を禁止する厳格なルールを作成したりする十分な理由ではありません. マイクロソフト (Anders Hejlsberg) は、大学教授には魅力的ではないかもしれないが、私の仕事の生産性を向上させる機能を提供することに前向きだったので、長い間 Java でプログラミングした後に C# に移行したことは、私がこれを評価するのに役立ったと言わざるを得ません。最終的には、出荷日が決まっている限られた時間の中で、より優れたウィジェットを構築できるようになります。