一般的な属性 (Visual Basic)

このトピックでは、Visual Basic プログラムで最もよく使用される属性について説明します。

グローバル属性

ほとんどの属性は、クラスやメソッドなど、特定の言語要素に適用されます。ただし、属性の中にはグローバルなものがあり、アセンブリまたはモジュール全体に適用されます。 たとえば、AssemblyVersionAttribute 属性は、次のように、バージョン情報をアセンブリに埋め込むときに使用できます。

<Assembly: AssemblyVersion("1.0.0.0")>

ソース コードでは、グローバル属性は、トップレベルの Imports ステートメントより後、型、モジュール、または名前空間の宣言より前に指定します。 グローバル属性は複数のソース ファイルに指定できますが、それらのファイルは、1 つのコンパイル パスでコンパイルする必要があります。 Visual Basic プロジェクトでは、グローバル属性が通常、AssemblyInfo.vb ファイルに配置されます (このファイルは、Visual Studio でプロジェクトを作成すると自動的に作成されます)。

アセンブリの属性は、アセンブリに関する情報を提供する値です。 これらは次のカテゴリに分けられます。

  • アセンブリ ID 属性

  • 情報属性

  • アセンブリ マニフェスト属性

アセンブリ ID 属性

アセンブリの ID は、名前、バージョン、カルチャの 3 つの属性によって識別されます (適用できる場合は厳密な名前も使用されます)。 アセンブリの完全な名前を形成するこれらの属性は、コード内でアセンブリを参照するときに必要になります。 アセンブリのバージョンとカルチャは、属性を使用して設定できます。 ただし名前の値は、コンパイラ、Visual Studio IDE の [アセンブリ情報] ダイアログ ボックス、またはアセンブリ リンカー (AI.exe) によってアセンブリの作成時に設定されます。このとき、設定はアセンブリ マニフェストが含まれたファイルに基づきます。 AssemblyFlagsAttribute 属性は、アセンブリの複数のコピーが共存できるかどうかを指定します。

次の表に ID 属性を示します。

属性 目的
AssemblyName アセンブリの ID を完全に記述します。
AssemblyVersionAttribute アセンブリのバージョンを指定します。
AssemblyCultureAttribute アセンブリがサポートするカルチャを指定します。
AssemblyFlagsAttribute 同じコンピューター、同じプロセス、または同じアプリケーション ドメインでの side-by-side 実行をアセンブリがサポートするかどうかを指定します。

情報属性

情報属性は、追加の会社情報または製品情報をアセンブリに指定する場合に使用できます。 次の表は、System.Reflection 名前空間で定義されている情報属性を示しています。

属性 目的
AssemblyProductAttribute アセンブリ マニフェストの製品名を指定するカスタム属性を定義します。
AssemblyTrademarkAttribute アセンブリ マニフェストの商標を指定するカスタム属性を定義します。
AssemblyInformationalVersionAttribute アセンブリ マニフェストの補足バージョンを指定するカスタム属性を定義します。
AssemblyCompanyAttribute アセンブリ マニフェストの会社名を指定するカスタム属性を定義します。
AssemblyCopyrightAttribute アセンブリ マニフェストの著作権を指定するカスタム属性を定義します。
AssemblyFileVersionAttribute Win32 ファイル バージョン リソースの特定のバージョン番号を使用するようコンパイラに指示します。
CLSCompliantAttribute アセンブリが共通言語仕様 (CLS) に準拠しているかどうかを示します。

アセンブリ マニフェスト属性

アセンブリ マニフェスト属性を使用すると、アセンブリ マニフェストの情報を指定できます。 ここには、タイトル、説明、既定の別名、構成が含まれます。 次の表は、System.Reflection 名前空間で定義されているアセンブリ マニフェスト属性を示しています。

属性 目的
AssemblyTitleAttribute アセンブリ マニフェストのアセンブリのタイトルを指定するカスタム属性を定義します。
AssemblyDescriptionAttribute アセンブリ マニフェストのアセンブリの説明を指定するカスタム属性を定義します。
AssemblyConfigurationAttribute アセンブリ マニフェストのアセンブリの構成 (製品版やデバッグなど) を指定するカスタム属性を定義します。
AssemblyDefaultAliasAttribute アセンブリ マニフェストのわかりやすい既定の別名を定義します。

Obsolete 属性

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 に適用された属性コンストラクターの 2 番目の引数が true に設定されているため、このメソッドではコンパイル エラーが発生します。一方、クラス A が使用されると、警告が生成されます。 しかし、B.NewMethod の呼び出しでは、警告もエラーも生成されません。

最初の引数として属性コンストラクターに指定された文字列は、警告またはエラーの一部として表示されます。 たとえば、前の定義でこれを使用すると、次のコードで 2 つの警告と 1 つのエラーが生成されます。

' 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 の警告が 2 つ生成されます。1 つはクラス参照の宣言の警告で、もう 1 つはクラス コンストラクターの警告です。

Obsolete 属性は引数なしで使用できますが、対象の項目が古い理由と代用する項目の説明を加えておくことをお勧めします。

Obsolete 属性は、1 回だけ使用できる属性であり、属性を使用できる任意のエンティティに適用できます。 ObsoleteObsoleteAttribute の別名です。

Conditional 属性

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

条件付きの印が付いたメソッドが呼び出されると、指定のプリプロセッサ シンボルの有無に従って、呼び出しの実行か省略が決定されます。 シンボルが定義されている場合は呼び出しが実行され、定義されていない場合は省略されます。 次のように、#if…#endif ブロック内でメソッドを囲むよりも Conditional を使用した方が、すっきりとして洗練されているうえ、エラーも少なくなります。

#If DEBUG Then
    Sub ConditionalMethod()
    End Sub
#End If

条件付きメソッドは、クラスまたは構造体の宣言内のメソッドである必要があります。また、戻り値を持つことはできません。

複数の識別子の使用

メソッドに複数の Conditional 属性が付いている場合、そのメソッドの呼び出しは、1 つ以上の条件付きシンボルが定義されているときに実行されます (つまり、シンボルは OR 演算子によって論理的にリンクされています)。 この例では、AB のどちらかがあると、メソッドの呼び出しが実行されます。

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

End Sub

AND 演算子で論理的にリンクされたシンボルの効果を実現するには、条件付きメソッドを連続して定義します。 たとえば、次の 2 番目のメソッドは、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 名前空間で定義されている呼び出し元情報の属性の一覧です。

属性 説明 種類
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

Visual Basic で強制的に固定長文字列を作成するには、VBFixedStringAttribute を使用します。 文字列は既定では可変長であるため、文字列をファイルに格納するときにこの属性が役立ちます。 その例を次のコードに示します。

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 の文字列と同様、配列も既定では可変長です。 データをシリアル化したりファイルに書き込んだりする際に、この属性が役立ちます。

関連項目