条件编译指南

ZDNet软件频道 时间:2006-05-19 作者:Tony Patton |  我要评论(7)
本文关键词:TonyPatton dotnettrend
条件编译是通过对代码中的条件编译常量的声明来实现的,具体来讲是使用VB.NET中的#Const指示符和C#中的#define指示符。
无标题文档

为什么要编译您不需要的代码?我们将向您展示如何使用条件编译常量使您的效益最大化。

当您编译的时候,在很多情况下某些代码并不是必须的,例如,您想在调试过程中包含测试代码,而在最终的产品中则去掉它们。幸好在C#,、VB.NET甚至J#中都提供了这样的功能,其条件编译是通过预处理指示符来实现的,这些指示符可以让您跳过源文件中的某些部分来编译,下面就让我们来仔细看看这一特色。

技术原理

条件编译(Conditional compilation)是通过对代码中的条件编译常量的声明来实现的,具体来讲是使用VB.NET中的#Const指示符和C#中的#define指示符,随着常量的定义,如果是VB.NET则通过#If..Then..#Else..#End来定义整块的代码,如果是C#则使用#if..then..#else..#endif来定义。

在列表A中的C#代码提供了使用这一技术的框架(如果条件编译常量Test被定义了,那么测试方法就会被编译)。

列表A:

#define test = true

class TestClass {

void test() {

#if test

// do something

#else

// do something else

#endif

}}

Here's the equivalent code in VB.NET:

#Const test = True

Class TestClass

Sub test()

#If test

'do something

#Else

'do something else

#End If

End Sub

End Class

所有包含在if语句中的代码都是被激活的,因此也就包含在编译中,而由于常量设为true,所以在else中的所有语句都没有包含在编译中。

条件编译常量通常是以私有属性出现在文件中,因而也就没有办法通过#Const指示符来声明公有编译常量,在VB.NET中,条件编译常量是唯一可以赋值的值类型,另一方面,C#则只使用布尔值 — 如果定义了那么常量就是true,使用#Const和#define关键字定义的常量只在条件编译中有效,它们在代码的其他部分不能使用。一个有意思的警告是如果在被一个if语句引用之前没有明确声明,那么这些常量可能是没有被定义的,在这种情况下,一个Nothing被赋值在VB.Net中,C#中则被赋与null,列表B包含了一个简单的例子,列表C包含了相应的C#代码。(注意它没有使用整数类型,而是使用了布尔值)

列表B:

#Const test = 0

Module Module1

Sub Main()

Dim firstValue As Integer

Dim secondValue As Integer

Dim result As Integer

firstValue = 12

secondValue = 10

result = Calculate(firstValue, secondValue)

Console.WriteLine("Return value = " + result.ToString())

End Sub

Public Function Calculate(ByVal x As Integer, ByVal y As Integer) As Integer

#If (test = 0) Then

Console.WriteLine("Values passed in: x = " + x.ToString() + ", y = " + y.ToString())

#End If

Dim rValue As Integer

rValue = (x + y) * 3

#If (test = 0) Then

Console.WriteLine("Calculated value = " + rValue.ToString())

Return rValue

#End If

End Function

End Module

列表C:

#define test

using System;

namespace TRExamples {

class Class1 {

static void Main(string[] args) {

intfirstValue = 12;

intsecondValue = 10;

int result = 0;

result = calculate(firstValue, secondValue);

Console.WriteLine("Return value: " + result.ToString());

}

public static int calculate(int x, int y) {

#if test

Console.WriteLine("Values passed in: x = " + x.ToString() + ", y = " + y.ToString());

#endif

intrValue = (x + y) * 3;

#if test

Console.WriteLine("Calculated value = " + rValue.ToString());

#endif

return rValue;

} } }

这个例子程序将会生成如下的结果:

Values passed in: x = 12, y = 10

Calculated value = 66

Return value: 66

如果将例子中的VB.NET的常量重新设置为一个非零数值而将C#代码中重新设置为false,将会生成如下结果:

Return value: 66

重新设置VB.NET中的数值就和分配必须的值一样简单,但是C#的工作方式略有不同,#undef指示符将常量设置为false,所以以下的代码会将测试常量设置为false,而此常量在默认情况下就是false(如果没有定义过),所以这些代码将会生成和删除掉#define所在行一样的结果,参见列表D:

列表D:

#define test

#undef test

using System;

namespace ConsoleCSharpCCompile {

class Class1 {

static void Main(string[] args) {

intfirstValue = 12;

intsecondValue = 10;

int result = 0;

result = calculate(firstValue, secondValue);

Console.WriteLine("Return value: " + result.ToString());

}

public static int calculate(int x, int y) {

#if test

Console.WriteLine("Values passed in: x = " + x.ToString() + ", y = " + y.ToString());

#endif

intrValue = (x + y) * 3;

#if test

Console.WriteLine("Calculated value = " + rValue.ToString());

#endif

return rValue;

} } }

您可以创建并使用您自己的常量来控制将那些代码进行编译,但是要注意这些保留常量。

保留常量(Reserved constants

一共有三个条件编译常量:Config、Debug和Trace。其中Debug和Trace是布尔数据类型,如果您使用的是Visual Studio .NET开发工具,那么可以在项目属性对话框中对它们进行定义,当Debug定义之后,Debug类方法就可以在输出窗口中输出结果了,如果它没有被定义,那么Debug类方法就不会被编译,从而也就没有Debug结果输出。同样的,如果使用了Trace,那么Trace类方法就会在输出窗口中输出结果,如果它没有被定义,那么Trace类方法就不会被编译,从而也就没有Trace结果输出。最后,Config常量是一个字符串数据类型,它与配置管理器窗口中的数值相关联。如果您使用的不是Visual Studio .NET,那么您可以将这些常量放置在代码的顶部。

只对您需要的代码进行编译

在.NET语言VB.NET和C#中的条件编译常量可以让您控制程序的编译版本中包含了那些代码,这些功能将为开发与测试过程中加入调试与其他额外代码,而最终编译是为去掉这些代码提供便利。毕竟,减少最终版本中的代码和处理量可以造就简便与轻巧的产品。

责任编辑:张琎

查看本文国际来源


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134