用过,主要是针对编译环境和非执行环境的一些不同而用的。
例如:
    运行时目录在Debug时是在.\bin\Debug目录。而执行是要取到另外一个目录是就得上两级目录才能取到。
string path = System.Windows.Forms.Application.StartupPath;
#if DEBUG
path = path.Replace(@"\bin\Debug","");
#endif
path = path+@"\template";
string filename = path +@"\"+name+ ".txt";
return LoadTemplate(filename);

解决方案 »

  1.   

    1. DEBUG和RELEASE
    最常用的是在Debug版本下,你需要向Console输出一些状态,而Release版本则不需要这些信息(或不想让用户看到这些信息)
    #if DEBUG
         Console.Write("Something");
    #endif
    2. 根据不同的系统,编译出不同的版本
    #define WINNT#if WINNT
        // some code here
    #endif
        // other code here再比如:
    object optional = null;
    #if OFFICEXP
             doc.SaveAs2000( ref fileName,
    #else
    doc.SaveAs( ref fileName,
    #endif
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional,
    ref optional);
    3. 控制版本的功能
    #define PRO_EDITION#if PRO_EDITION
       // code here
    #elif FREE_EDITION
       // code here
    #elif ENTERPRISE_EDITION
       // code here
    #else
       // other edition
    #endif
    这样可以在不同的版本禁用或启用某些功能。一些大型的系统,条件编译的参数可达数百个,主要就是根据不同的系统,不同的需要在一份源代码上编译出各种不同的版本。
      

  2.   

    C# 程序员参考   Conditional请参见
    C# 属性 | 条件方法教程 | C# 预处理器指令
    标记其执行取决于指定预处理标识符的条件方法。[Conditional(
       conditionalSymbol
    )]
    参数
    conditionalSymbol 
    表示预处理标识符名称的 string。 
    应用于
    方法声明。备注
    Conditional 属性是可以多次使用的属性。Conditional 是 System.Diagnostics.ConditionalAttribute 的别名。只要调用条件方法,在调用的位置由 conditionalSymbol 指定的预处理符号的出现与否就决定是包含还是省略调用。如果定义了该符号,则包含调用;否则省略调用。条件方法提供了一种更清晰、更巧妙的方法,可替代将方法调用封装在 #if conditionalSymbol...#endif 预处理器指令中的做法。条件方法必须是类或结构声明中的方法,并且必须具有 void 返回类型(有关其他限制,请参见 17.4.2 Conditional 属性)。如果某个方法具有多个 Conditional 属性,且至少定义了多个条件符号(换言之,这些符号彼此之间存在逻辑“或”关系)中的一个,则将包含对该方法的调用。[Conditional("A"), Conditional("B")] public static void IfAorB( ) 
    {
       ...
    }
    若获得对符号进行逻辑“与”运算的效果,可以定义序列条件方法:[Conditional("A")] public static void IfAandB( ) 
    {
       AandBPrivate( ); 
    }
    [Conditional("B")] static void AandBPrivate( ) 
    {
       /* Code to execute when both A and B are defined... */
    }
    调用 IfAandB;如果既定义了 A 又定义了 B,则将执行 AandBPrivate。示例
    // cs_attribute_conditional.cs
    #define DEBUG
    using System;
    using System.Diagnostics;
    public class Trace 
    {
       [Conditional("DEBUG")] public static void Msg(string msg) 
       {
          Console.WriteLine(msg);
       }
    }
    class Test 
    {
       static void A( ) 
       {
          Trace.Msg("Now in A.");
          B( );
       }
       static void B( ) 
       {
          Trace.Msg("Now in B.");
       }
       public static void Main( ) 
       {
          Trace.Msg("Now in Main.");
          A( );
          Console.WriteLine("Done.");
       }
    }
    输出
    Now in Main.
    Now in A.
    Now in B.
    Done.
    如果编译该示例时省略第一行(或更改为 #undef DEBUG),则输出将为:Done.。请参见