1 / 10
文档名称:

条款4:使用Conditional特性代替#if条件编译.doc

格式:doc   大小:16KB   页数:10页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

条款4:使用Conditional特性代替#if条件编译.doc

上传人:好用的文档 2021/10/25 文件大小:16 KB

下载得到文件列表

条款4:使用Conditional特性代替#if条件编译.doc

相关文档

文档介绍

文档介绍:条款4:使用Conditional特性代替#if条件编译
#if/#endif 条件编译常用来由同一份源代码生成不同的结果文件,最常见的有debug版和release版。但是,这些工具在具体应用中并不是非常得心应手,因为它们太容易被滥用了,使用它们创建的代码通常都比较难理解,且难以调试。C#语言的设计者们对这种问题的解决方案是创建更好的工具,以达到为不同环境创建不同 机器码的目的。C#为此添加了一个Conditional特性,该特性可以标示出某种环境设置下某个方法是否应该被调用。使用这种方式来描述条件编译要比 #if/#endif更加清晰。由于编译器理解Conditional特性,所以它可以在Conditional特性被应用时对代码做更好的验证。 Conditional特性应用在方法这一层次上,因此它要求我们将条件代码以方法为单位来表达。当需要创建条件代码块时,我们应该使用 Conditional特性来代替传统的#if/#endif。
大多数程序老手都使用过条件编译来检查对象的前置条件和后置条件。例如,编写一个私有方法来检查所有类与对象的不变式(invariant)[8],然后将这样的方法进行条件编译,从而让其只出现在debug版本的程序中。
private void CheckState( )
{
// 老式的做法:
#if DEBUG
( "Entering CheckState for Person" );
// 获取正在被调用函数的名称:
string methodName = new StackTrace( ).GetFrame(1 ).GetMethod( ).Name;
( _lastName != null,methodName,"Last Name cannot be null" );
( > 0,methodName, "Last Name cannot be blank" );
( _firstName != null, methodName,"First Name cannot be null" );
( > 0,methodName, "First Name cannot be blank" );
( "Exiting CheckState forPerson" );
#endif
}
条件编译#if和#endif使得最终 release版本中的CheckState()成为一个空方法,但它在release版和debug版中都将得到调用。虽然在release版中, CheckState()什么也不做,但是我们必须为方法的加载、JIT编译和调用付出成本。
就正确性而言,这种做法一般没什么问题,但有时候还是可能会在release版本中导致一些诡异的bug。下面的代码展示了使用#if和#endif条件编译时可能常犯的错误:
public void Func( )
{
string msg = null;

最近更新