条件编译&条件属性
1.#if/#else/#endif条件编译
条件编译语句关键字为:#if#else,#endif。下面直接通过一个例子说明其用法:
#if NET35 || NET20 using System.Web.UI.WebControls.WebParts; #else //如果是NET10时,不编译任何代码 #endif |
上面的条件符号NET35和NET20是我们自己定义的一些字符串,注意在命名时不要随便定义无意义的条件符号。那么编译系统怎么肯定会了解我们定义的这些NET35,NET20条件符号呢?下面就说明条件符号是怎么通知编译器的,右击控件库项目,选择"属性"命令,会打开项目属性配置窗口,选择左边的"生成"选项卡,会看到在"常规"下面有一项就是让我们设置条件编译符号的,如图3-4所示。
(点击查看大图)图3-4 设置条件编译符号 |
除了以上对命名空间进行条件编译,用得更多的是对功能代码语句进行条件编译。也举一个例子,代码如下:
#if NET35 || NET20 if (this.DesignMode) { //功能A语句 } else { //功能B语句 } #else //功能B语句 #endif |
以上是讲的条件编译功能,使用了条件编译功能无须改变代码,只要根据不同的开发环境修改一下编译条件符号就可以满足同一份代码支持跨版本功能。
2.条件属性
除了条件编译,C#还提供了条件属性(Conditional attribute)来根据当前环境决定哪些方法是否应该被调用。直接通过一个例子说明其使用方法,代码如下:
/// <summary> /// 获得本书更多内容,请看: /// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx /// </summary> [Conditional("StartDebug")] private void TraceDebug(string str) { if (String.IsNullOrEmpty(str) == true) { Trace.WriteLine("值为NULL!"); } //Trace, Debug, Record log to database etc } |
System.Diagnostics.Debug System.Diagnostics.Trace |
TraceDebug方法使用很简单,可以在任意想调试的地方调用此方法。下面的设计属性语句:
[Conditional("StartDebug")] |
这里的条件属性用在方法上,因为使用它的最小单位是方法,上面的#if,#else最小单位是语句,当然也可以是方法(只要使用#if,#else把方法嵌套起来)。条件属性方式也有很多优点,使用条件属性可以比使用#if,#endif生成更高效的IL代码;而且代码看起来比#if,#else方式要清晰些,尤其是像上面的代码较多的TraceDebug方法,如果嵌入到程序代码中看起来是非常乱的。
本节讲的方法各有优缺点,可以根据需求和自己爱好选择,目的是把开发成本减少到最小。
本节内容不仅用于控件开发,对于整个ASP.NET应用程序开发也是如此。