特性概述 (Visual Basic)
使用特性,可以有效地将元数据或声明性信息与代码(程序集、类型、方法、属性等)相关联。 将特性与程序实体相关联后,可以在运行时使用反射这项技术查询特性。 有关详细信息,请参阅反射 (Visual Basic)。
特性具有以下属性:
特性向程序添加元数据。 元数据是程序中定义的类型的相关信息。 所有 .NET 程序集都包含一组指定的元数据,用于描述程序集中定义的类型和类型成员。 可以添加自定义特性来指定所需的其他任何信息。 有关详细信息,请参阅创建自定义特性 (Visual Basic)。
可以将一个或多个特性应用于整个程序集、模块或较小的程序元素(如类和属性)。
特性可以像方法和属性一样接受自变量。
程序可使用反射来检查自己的元数据或其他程序中的元数据。 有关详细信息,请参阅使用反射访问特性 (Visual Basic)。
使用属性
可以将特性附加到大多数的声明中,尽管特定特性可能会限制可有效附加到的声明的类型。 在 Visual Basic 中,属性是用尖括号 (<>) 括起来的内容。 特性的后面必须紧接着应用它的元素,且两者必须位于同一代码行。
在此示例中,SerializableAttribute 特性用于将具体特征应用于类:
<System.Serializable()> Public Class SampleClass
' Objects of this type can be serialized.
End Class
下方声明了一个具有特性 DllImportAttribute 的方法:
Imports System.Runtime.InteropServices
<System.Runtime.InteropServices.DllImport("user32.dll")>
Sub SampleMethod()
End Sub
可以将多个特性附加到声明中:
Imports System.Runtime.InteropServices
Sub MethodA(<[In](), Out()> ByVal x As Double)
End Sub
Sub MethodB(<Out(), [In]()> ByVal x As Double)
End Sub
对于给定实体,一些特性可以指定多次。 ConditionalAttribute 便属于此类多用途特性:
<Conditional("DEBUG"), Conditional("TEST1")>
Sub TraceMethod()
End Sub
注意
按照约定,所有特性名称均以“Attribute”一词结尾,以便与 .NET Framework 中的其他项区分开来。 不过,在代码中使用特性时,无需指定特性后缀。 例如,[DllImport]
等同于 [DllImportAttribute]
,但 DllImportAttribute
是此特性在 .NET Framework 中的实际名称。
特性参数
许多属性都有参数,可以是位置参数、未命名参数或已命名参数。 所有位置参数都必须按特定的顺序指定,不能省略;已命名参数是可选的,可以按任意顺序指定。 首先指定的是位置参数。 例如,下面这三个特性是等同的:
<DllImport("user32.dll")>
<DllImport("user32.dll", SetLastError:=False, ExactSpelling:=False)>
<DllImport("user32.dll", ExactSpelling:=False, SetLastError:=False)>
第一个参数(DLL 名称)是位置参数,始终第一个出现;其他是已命名参数。 在此示例中,两个已命名参数的默认值均为 false,因此可以省略。 若要了解默认参数值,请参阅各个特性文档。
特性目标
特性的目标是指应用特性的实体。 例如,特性可应用于类、特定方法或整个程序集。 默认情况下,特性应用于它后面紧接着的元素。 不过,还可以进行显式标识。例如,可以标识为将特性应用于方法,还是应用于其参数或返回值。
若要显式标识特性目标,请使用以下语法:
<target : attribute-list>
下表列出了可能的 target
值。
目标值 | 适用对象 |
---|---|
assembly |
整个程序集 |
module |
当前的程序集模块(不同于 Visual Basic 模块) |
下面的示例展示了如何将特性应用于程序集和模块。 有关详细信息,请参阅常见特性 (Visual Basic)。
Imports System.Reflection
<Assembly: AssemblyTitleAttribute("Production assembly 4"),
Module: CLSCompliant(True)>
特性的常见用途
下面列出了代码中特性的一些常见用途:
在 Web 服务中使用
WebMethod
特性标记方法,以指明方法应可通过 SOAP 协议进行调用。 有关详细信息,请参阅 WebMethodAttribute。描述在与本机代码互操作时如何封送方法参数。 有关详细信息,请参阅 MarshalAsAttribute。
描述类、方法和接口的 COM 属性。
使用 DllImportAttribute 类调用非托管代码。
从标题、版本、说明或商标方面描述程序集。
描述要序列化并暂留类的哪些成员。
描述如何为了执行 XML 序列化在类成员和 XML 节点之间进行映射。
描述的方法的安全要求。
指定用于强制实施安全规范的特征。
通过实时 (JIT) 编译器控制优化,这样代码就一直都易于调试。
获取方法调用方的相关信息。
相关章节
有关详细信息,请参见: