本主题介绍 Visual Basic 程序中最常用的属性。
全局特性
大多数属性都应用于特定语言元素,例如类或方法;但是,某些属性是全局属性,它们适用于整个程序集或模块。 例如, AssemblyVersionAttribute 该属性可用于将版本信息嵌入程序集中,如下所示:
<Assembly: AssemblyVersion("1.0.0.0")>
全局属性显示在任何顶级 Imports
语句之后的源代码中,在任何类型、模块或命名空间声明之前。 全局属性可以出现在多个源文件中,但这些文件必须在一个编译过程中进行编译。 对于 Visual Basic 项目,全局属性通常放在AssemblyInfo.vb文件中(在 Visual Studio 中创建项目时会自动创建该文件)。
程序集属性是提供有关程序集的信息的值。 它们分为以下类别:
程序集标识特性
信息的属性
程序集清单特性
程序集标识属性
三个特性(与强名称(如果适用))组合起来可以确定程序集的标识:名称、版本和区域性。 这些属性构成了程序集的全名,在代码中引用它时是必需的。 可使用特性设置程序集的版本和区域性。 但是,名称值由编译器、 程序集信息对话框中的 Visual Studio IDE 或程序集链接器(Al.exe)在创建程序集时根据包含程序集清单的文件设置。 该 AssemblyFlagsAttribute 属性指定程序集的多个副本是否可以共存。
下表显示了标识属性。
特征 | 目的 |
---|---|
AssemblyName | 详细描述程序集的标识。 |
AssemblyVersionAttribute | 指定程序集的版本。 |
AssemblyCultureAttribute | 指定程序集支持的区域性。 |
AssemblyFlagsAttribute | 指定程序集是否支持在同一台计算机、同一进程中或同一应用程序域中并行执行。 |
信息性特性
可以使用信息属性为程序集提供其他公司或产品信息。 下表显示了命名空间中 System.Reflection 定义的信息属性。
特征 | 目的 |
---|---|
AssemblyProductAttribute | 定义一个自定义属性,该特性指定程序集清单的产品名称。 |
AssemblyTrademarkAttribute | 定义为程序集清单指定商标的自定义属性。 |
AssemblyInformationalVersionAttribute | 定义一个自定义属性,该特性指定程序集清单的信息版本。 |
AssemblyCompanyAttribute | 定义一个自定义属性,该属性用于指定程序集清单中的公司名称。 |
AssemblyCopyrightAttribute | 定义为程序集清单指定版权的自定义属性。 |
AssemblyFileVersionAttribute | 指示编译器使用 Win32 文件版本资源的特定版本号。 |
CLSCompliantAttribute | 指示程序集是否符合公共语言规范(CLS)。 |
程序集清单特性
可以使用程序集清单属性在程序集清单中提供信息。 这包括标题、说明、默认别名和配置。 下表显示了在System.Reflection命名空间中定义的程序集清单属性。
特征 | 目的 |
---|---|
AssemblyTitleAttribute | 定义一个自定义属性,该特性指定程序集清单的程序集标题。 |
AssemblyDescriptionAttribute | 定义为程序集清单指定程序集说明的自定义属性。 |
AssemblyConfigurationAttribute | 定义为程序集清单指定程序集配置(如零售或调试)的自定义属性。 |
AssemblyDefaultAliasAttribute | 定义程序集清单的友好默认别名 |
已过时属性
该 Obsolete
属性将程序实体标记为不再推荐使用的程序实体。 每次使用标记为已过时的实体都会生成警告或错误,具体取决于属性的配置方式。 例如:
<System.Obsolete("use class B")>
Class A
Sub Method()
End Sub
End Class
Class B
<System.Obsolete("use NewMethod", True)>
Sub OldMethod()
End Sub
Sub NewMethod()
End Sub
End Class
在此示例中,属性 Obsolete
应用于类 A
和方法 B.OldMethod
。 由于应用于B.OldMethod
的属性构造函数的第二个参数设置为true
,因此此方法将导致编译器错误,而使用类A
则只会生成警告。 但是,调用 B.NewMethod
不会生成任何警告或错误。
作为属性构造函数的第一个参数提供的字符串将显示为警告或错误的一部分。 例如,将其与先前的定义一起使用时,以下代码会生成两个警告和一个错误:
' Generates 2 warnings:
' Dim a As New A
' Generate no errors or warnings:
Dim b As New B
b.NewMethod()
' Generates an error, terminating compilation:
' b.OldMethod()
将生成类 A
的两个警告:一个用于声明类引用,另一个用于类构造函数。
Obsolete
该属性可以不使用参数,但包括有关项已过时的原因的说明,以及建议改用什么。
Obsolete
特性是一次性特性,可以应用于任何允许特性的实体。
Obsolete
是 ObsoleteAttribute 的别名。
条件属性
Conditional
特性使得方法执行依赖于预处理标识符。
Conditional
属性是 ConditionalAttribute 的别名,可以应用于方法或特性类。
在此示例中, Conditional
应用于启用或禁用显示程序特定的诊断信息的方法:
#Const TRACE_ON = True
Imports System.Diagnostics
Module TestConditionalAttribute
Public Class Trace
<Conditional("TRACE_ON")>
Public Shared Sub Msg(ByVal msg As String)
Console.WriteLine(msg)
End Sub
End Class
Sub Main()
Trace.Msg("Now in Main...")
Console.WriteLine("Done.")
End Sub
End Module
TRACE_ON
如果未定义标识符,则不会显示跟踪输出。
该Conditional
属性通常与DEBUG
标识符一起使用,以便为调试版本启用跟踪和日志记录功能,但不在发布版本中使用,如下所示:
<Conditional("DEBUG")>
Shared Sub DebugMethod()
End Sub
调用标记为条件的方法时,指定的预处理符号的存在或缺少确定调用是包含还是省略。 如果定义了符号,则将包括调用;否则,将忽略该调用。 使用 Conditional
是一种更简洁、更优雅、更不易出错的替代方法,来代替在 #if…#endif
块中包含方法,如下所示:
#If DEBUG Then
Sub ConditionalMethod()
End Sub
#End If
条件方法必须是类或结构声明中的方法,并且不能具有返回值。
使用多个标识符
如果某个方法具有多个 Conditional
属性,那么当至少定义了一个条件符号时,将调用该方法(换句话说,这些符号通过使用 OR 运算符以逻辑方式链接在一起)。 在此示例中,存在A
或B
中的任何一个都将导致方法调用。
<Conditional("A"), Conditional("B")>
Shared Sub DoIfAorB()
End Sub
若要使用 AND 运算符实现逻辑链接符号的效果,可以定义串行条件方法。 例如,下面的第二种方法仅在两者A
B
均已定义时才执行:
<Conditional("A")>
Shared Sub DoIfA()
DoIfAandB()
End Sub
<Conditional("B")>
Shared Sub DoIfAandB()
' Code to execute when both A and B are defined...
End Sub
将 Conditional 用于特性类
Conditional
特性还可应用于特性类定义。 在此示例中,自定义属性 Documentation
仅在定义 DEBUG 时向元数据添加信息。
<Conditional("DEBUG")>
Public Class Documentation
Inherits System.Attribute
Private text As String
Sub New(ByVal doc_text As String)
text = doc_text
End Sub
End Class
Class SampleClass
' This attribute will only be included if DEBUG is defined.
<Documentation("This method displays an integer.")>
Shared Sub DoWork(ByVal i As Integer)
System.Console.WriteLine(i)
End Sub
End Class
调用方信息特性
通过使用调用方信息属性,可以获取有关方法调用方的信息。 可以获取源代码的文件路径、源代码中的行号和调用方的成员名称。
若要获取成员调用方信息,请使用应用于可选参数的属性。 每个可选参数指定默认值。 下表列出了命名空间中 System.Runtime.CompilerServices 定义的调用方信息属性:
特征 | DESCRIPTION | 类型 |
---|---|---|
CallerFilePathAttribute | 包含调用方的源文件的完整路径。 这是编译时的路径。 | String |
CallerLineNumberAttribute | 从中调用该方法的源文件中的行号。 | Integer |
CallerMemberNameAttribute | 调用方的方法名称或属性名称。 有关详细信息,请参阅调用方信息(Visual Basic)。 | String |
CallerArgumentExpressionAttribute | 调用方用于实参的表达式。 有关详细信息,请参阅调用方信息(Visual Basic)。 | String |
有关调用方信息属性的详细信息,请参阅“调用方信息”(Visual Basic)。
Visual Basic 属性
下表列出了特定于 Visual Basic 的属性。
特征 | 目的 |
---|---|
ComClassAttribute | 向编译器指示该类应作为 COM 对象公开。 |
HideModuleNameAttribute | 允许仅根据模块定义的资格来访问模块成员。 |
VBFixedStringAttribute | 指定结构中用于文件输入和输出函数的固定长度字符串的大小。 |
VBFixedArrayAttribute | 指定结构中用于文件输入和输出函数的固定数组的大小。 |
COMClassAttribute
用于 COMClassAttribute
简化从 Visual Basic 创建 COM 组件的过程。 COM 对象与 .NET Framework 程序集大相径庭,在没有 COMClassAttribute
的情况下,需要执行许多步骤才能从 Visual Basic 生成 COM 对象。 对于标记 COMClassAttribute
的类,编译器会自动执行其中许多步骤。
HideModuleNameAttribute
使用 HideModuleNameAttribute
允许仅使用该模块所需的资格访问模块成员。
VBFixedStringAttribute
用于 VBFixedStringAttribute
强制 Visual Basic 创建固定长度字符串。 默认情况下,字符串长度可变,在将字符串存储到文件时,此属性非常有用。 以下代码演示了这一点:
Structure Worker
' The runtime uses VBFixedString to determine
' if the field should be written out as a fixed size.
<VBFixedString(10)> Public LastName As String
<VBFixedString(7)> Public Title As String
<VBFixedString(2)> Public Rank As String
End Structure
VBFixedArrayAttribute
用于 VBFixedArrayAttribute
声明大小固定的数组。 与 Visual Basic 字符串一样,数组默认为可变长度。 序列化或将数据写入文件时,此属性非常有用。