通用属性 (Visual Basic)

本主题介绍 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 特性是一次性特性,可以应用于任何允许特性的实体。 ObsoleteObsoleteAttribute 的别名。

条件属性

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 运算符以逻辑方式链接在一起)。 在此示例中,存在AB中的任何一个都将导致方法调用。

<Conditional("A"), Conditional("B")>
Shared Sub DoIfAorB()

End Sub

若要使用 AND 运算符实现逻辑链接符号的效果,可以定义串行条件方法。 例如,下面的第二种方法仅在两者AB均已定义时才执行:

<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 字符串一样,数组默认为可变长度。 序列化或将数据写入文件时,此属性非常有用。

另请参阅