属性的应用
更新:2007 年 11 月
通过向程序元素(如属性、方法、事件、类和程序集)添加属性块来应用属性。属性块由尖括号(“< >”)组成,其中包含逗号分隔的属性声明列表。属性声明由可选属性修饰符(如 Module 或 Assembly)、属性名称、必需的定位参数的列表(可能会重载)和可选命名参数的列表组成。必须将带有修饰符的属性放在源文件顶部的属性部分中。例如,以下代码设置为程序集定义标题的程序集属性和指示模块符合“公共语言规范”(CLS) 的模块属性:
Imports System.Reflection
<Assembly: AssemblyTitleAttribute("Production assembly 4"), _
Module: CLSCompliant(True)>
也可以通过 AssemblyInfo.vb 文件应用程序集属性,该文件由 Visual Studio 用户界面自动添加到项目中。此文件包含带有默认值或空值的程序集级属性。
当应用于诸如属性的程序元素时,属性优先于元素。例如,下面的代码将属性应用于类定义:
<CustomAttr(Update:=True)> Class Class1
根据约定,所有属性名称都以单词“Attribute”结束,以便与 .NET Framework 中的其他项区分。但是,使用属性时不需要指定属性后缀。例如,如果有一个名为 CustomAttrAttribute 的属性,则指定 <CustomAttr(Update:=True)> 等效于指定 <CustomAttrAttribute(Update:=True)>。
属性参数
属性使用可选参数、必选参数、定位参数和命名参数的方法与对象使用这些类型的参数的方法很相似。定位参数是按其在为某一属性的构造函数声明的顺序而指定的参数。例如,以下代码调用具有两个值的属性的 Sub New 构造函数:
<CustomAttr(True, False)> Class Class1
传递给属性类中 Sub New 的参数通常用于初始化字段和属性的值。
可以使用命名参数直接设置属性和字段的值。通过给参数的名称追加“:=”可指定命名参数,等号后面是指定的值。与定位参数不同,命名参数可以按任意顺序指定。例如,下面的代码将 Update 字段的值设置为 True;将 Keep 字段的值设置为 False:
<CustomAttr(Update:=True, Keep:=False)> Class Class1
说明: |
---|
属性参数与用于标准方法调用的参数有一个重要区别。在属性类的 Sub New 构造函数中,必须使用位置参数。命名参数只能用于设置属性类的字段和属性的值。 |
必选参数是必须始终指定的参数。可选参数是(在使用定位参数时)可以用逗号作为占位符而跳过的参数,或(在使用命名参数时)可以直接忽略的参数。
属性参数必须为常量表达式。
属性示例
以下过程提供了几个属性声明的示例。
使用 MarshalAs 属性控制如何封送参数
将 System.Runtime.InteropServices 命名空间的 Imports 语句添加到源代码顶部:
Imports System.Runtime.InteropServices
以 MarshalAsAttribute 属性作为参数前缀并指定目标需要的数据类型。例如,以下代码将两个参数作为数据类型长指针封送到 Windows API 函数的字符串 (LPStr):
Declare Auto Sub CopyFile Lib "Kernel32.Lib" ( _ <MarshalAs(UnmanagedType.LPWStr)> ByVal existingfile As String, _ <MarshalAs(UnmanagedType.LPWStr)> ByVal newfile As String, _ ByVal failifexists As Boolean _ )
公共语言运行库使用 MarshalAsAttribute 属性确定应该如何在 Visual Basic 的托管代码和 Windows API 调用中的非托管代码之间封送参数。
向远程 Web 客户公开方法
在“文件”菜单中,单击“项目”,选择“ASP.NET Web 服务”模板,然后为 System.Web 命名空间添加一条 Imports 语句:
Imports System.Web.Services
定义一个方法并使用 WebMethodAttribute 属性以便可以从远程 Web 客户端调用该方法:
<WebMethod()> Public Function HelloWorld() As String HelloWorld = "Hello World..." End Function
使一个 XML Web services 方法为 Public 并不足以能将其向 Web 客户端公开。在远程 Web 客户端能够调用 WebMethodAttribute 属性之前,必须显式将该属性应用到某个方法中。