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