{ //单元测试代码 } }
这段代码说明,该类的方法UnitTest()是否有效,将取决于预处理标识符“DEBUG”是否被定义(译注:在编译调试版本时,DEBUG常数已经被定义)。我们可能更感兴趣的是,使用[Conditional]后真正发生了什么。当条件失效时,编译器将会停止所有对该方法的调用,相比有同样功能的预处理指令#if...#endif,此方法显得更简洁,而且,使用这项功能,我们不需要多做任何事情。
特性使用了定位参数和命名参数。在使用了[Conditional]特性的例子中,特定的符号就是定位参数。定位参数是强制性的,你必须提供。
让我们回到使用了[WebMethod]特性的例子,来看一下命名参数。这个特性有一个Description的命名参数,可以像下面这样使用:
[WebMethod(Description = "Sales volume")]
命名参数是可选择的,参数的值要紧跟着写在参数名字的后面。如果存在定位参数,那么你需要先书写定位参数,然后在定位参数的后面书写命名参数。
我将会在文章的后面讲述更多关于定位参数和命名参数的内容,这将在我向你展示如何创建和使用你自己的特性类时提到。
特性可用于运行时,设计时
在这篇文章里,我提供的都是与运行时的行为相关的例子。但是二进制文件(程序集)并不只是用于运行时。在.NET里,你所定义的元数据也不只是局限于运行时,相反,当你编译成程序集后,在任何时候你都可以查阅这些元数据。
考虑在设计时,使用元数据的一些可能的情况。在Visual Studio.Net里,使用IDE可以构建工具(使用.NET语言),方便开发和设计(向导,构建器等等)。这样,一个模块的运行时的环境(如:IDE工具)就成了另一个模块的设计时环境(被开发的源代码)。这里提供了一个使用定制特性很好的例子。IDE工具将会反射你编写的类和类型,然后遵照你的代码行事。不幸的是,由于没有IDE工具的代码,探究这样的例子,已经超出了该文章所阐述的范围。
标准的.NET特性包含了一个类似的例子。当一个开发者创建自定义控件并把它放到Visual Studio.Net IDE的工具箱中,它们(自定义控件)已经使用了一系列特性,用于说明在属性表单中如何处理自定义控件。Table1列举并描述了在属性表单中用到的4种标准的.NET特性。
Table 1: 在Visual Studio .NET IDE里设计时属性表单用到的标准的.NET特性.
Attribute Description Designer 指定用于为组件实现设计时服务的类。 DefaultProperty 指定在属性表单中,组件的默认的属性。 Category 指定在属性表单中,属性的类别。 Description 指定在属性表单中,有关属性的描述。
这些与表单相关的特性,让我们认识到,可以在设计时使用特性以及它们的值,就像在运行时一样。 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页
|