条件编译&条件属性

来源:互联网 发布:网络用语社会啥意思 编辑:程序博客网 时间:2024/04/29 03:02

条件编译&条件属性

在实际开发中,经常需要根据不同运行环境下生成相应的机器代码。最愚蠢的办法是根据不同的环境注释掉相应的语句,或者取消对需要的语句的注释,这样每换一次环境就必须修改代码。为了解决这个问题,.NET Framework提供了一些支持:条件编译和条件属性。
1.#if/#else/#endif条件编译
条件编译语句关键字为:#if#else,#endif。下面直接通过一个例子说明其用法:
#if NET35 || NET20
using System.Web.UI.WebControls.WebParts;
#else
//如果是NET10时,不编译任何代码
#endif以上代码意思是如果.NET Framework至少是2.0以上版本,才会打开WebParts命名空间,因为在.NET Framework 1.0还不支持WebParts控件。在条件编译代码语句中的符号&&(并且)和||(或者)跟普通C#代码语句中的&&和||符号含义相同。再强调一下,以上的条件编译符号的作用是指在编译时是否会编译语句中的语句,而不是运行时。
上面的条件符号NET35和NET20是我们自己定义的一些字符串,注意在命名时不要随便定义无意义的条件符号。那么编译系统怎么肯定会了解我们定义的这些NET35,NET20条件符号呢?下面就说明条件符号是怎么通知编译器的,右击控件库项目,选择"属性"命令,会打开项目属性配置窗口,选择左边的"生成"选项卡,会看到在"常规"下面有一项就是让我们设置条件编译符号的,如图3-4所示。
(点击查看大图)图3-4  设置条件编译符号如果您使用的是VS 2008就设置NET35;如果使用的是VS 2005,就设置NET20即可,并且此项设置支持使用分号隔开,能写多个符号。还要注意对于系统自己使用的一些关键字如DEBUG等,就不能使用了(即使设置了,系统也不会保存)。
除了以上对命名空间进行条件编译,用得更多的是对功能代码语句进行条件编译。也举一个例子,代码如下:
#if NET35 || NET20
if (this.DesignMode)
{
//功能A语句
}
else
{
//功能B语句
}
#else
//功能B语句
#endif这段代码表明this.DesignMode属性在.NET Framework 2.0或更高版本,才支持通过设置条件编译在不同开发环境下实现不同的代码,并且保证即使在.NET framework 1.0环境下编译也不会出错。
以上是讲的条件编译功能,使用了条件编译功能无须改变代码,只要根据不同的开发环境修改一下编译条件符号就可以满足同一份代码支持跨版本功能。
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
}以上方法主要完成调试功能。在实际应用中可以使用.NET Framework提供的一些跟踪调试类,比如:
System.Diagnostics.Debug
System.Diagnostics.Trace来进行跟踪和调试,例如Debug类的Degbug.Assert断言方法等;或者采用定义自己的输出方式,比如记录到数据库等,来跟踪和调试。
TraceDebug方法使用很简单,可以在任意想调试的地方调用此方法。下面的设计属性语句:
[Conditional("StartDebug")]表示只能定义了"StartDebug"的条件符号,此方法才会执行;否则,当执行到此方法时会自动跳过此方法,继续执行下面的语句。设置"StartDebug"条件符号的规则与1中讲的#if,#else等条件编译一样,也是在项目属性配置窗口设置,请参考1中的讲解。
这里的条件属性用在方法上,因为使用它的最小单位是方法,上面的#if,#else最小单位是语句,当然也可以是方法(只要使用#if,#else把方法嵌套起来)。条件属性方式也有很多优点,使用条件属性可以比使用#if,#endif生成更高效的IL代码;而且代码看起来比#if,#else方式要清晰些,尤其是像上面的代码较多的TraceDebug方法,如果嵌入到程序代码中看起来是非常乱的。
本节讲的方法各有优缺点,可以根据需求和自己爱好选择,目的是把开发成本减少到最小。
本节内容不仅用于控件开发,对于整个ASP.NET应用程序开发也是如此。
原创粉丝点击