特性提供了一种强大的元数据或声明性信息与代码(程序集、类型、方法、属性等)相关联的方法。 将特性与程序实体相关联后,可以在运行时使用反射这项技术查询特性。 有关详细信息,请参阅反射(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) 编译器控制优化,使代码更易于调试。
获取方法调用方的相关信息。
相关部分
有关详细信息,请参见: