百度空间 | 百度首页 
 
查看文章
 
《Effective C#》笔记4.使用Conditional特性代替#if条件编译
2007-12-14 09:23

#if/#endif条件编译用来由一份源代码生成不同的结果文件,常见的有debug版和release版。但这样创建的代码比较难理解且难调试,下面的代码在release版本中实际上变成了一个空方法,但在release和debug版本中都将会调用,虽然在release版中什么都不做,但也会为方法的加载和调用付出成本。

private void CheckState()
{
     #if DEBUG
    //…
     #endif
}

C#因此提出了更好的选择,使用conditional特性,conditional可以将一些函数隔离出来,使得它们在某些环境下才能生效

[Conditional("DEBUG")]
private void CheckState()
{}

上面的CheckState()只有在DEBUG环境下才会产生对CheckState()的调用,即Conditional不会影响它的编译,只会影响对该方法的调用。如:

public string LastName
{
    get{
        CheckState();
        Return _lastName;
     }
    set
     {
        CheckState();
        _lastName = value;
        CheckState();
     }
}


上面的代码在DEBUG环境时会正常执行,但到了其它运行环境时就变成了:

public string LastName
{
    get
     {
        return _lastName;
     }
    set
     {
        _lastName = value;
     }
}

无论是否有定义DEBUG符号,CheckState()都维持不变,并会被编译到程序集中,虽然看起来会有效率损失,但实际只是耗费了磁盘空间而已,如果没有被调用,是不会被加载到内存中的。
我们也可以依赖多个环境变量,它们之间是"或"的关系
[Conditional("DEBUG"), Conditional("TRACE")]
如果要使用"与"的关系进行判读,我们还是需要使用#if/#endif符号
#if(VAR1 && VAR2)
//…
#endif

另外,还需要注意的是Conditional特性只能对方法使用,而且只能返回void类型。


类别:asp.net | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu