一般的な属性 (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 回だけ使用できる属性であり、属性を使用できる任意のエンティティに適用できます。 Obsolete
は ObsoleteAttribute の別名です。
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 演算子によって論理的にリンクされています)。 この例では、A
と B
のどちらかがあると、メソッドの呼び出しが実行されます。
<Conditional("A"), Conditional("B")>
Shared Sub DoIfAorB()
End Sub
AND 演算子で論理的にリンクされたシンボルの効果を実現するには、条件付きメソッドを連続して定義します。 たとえば、次の 2 番目のメソッドは、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 名前空間で定義されている呼び出し元情報の属性の一覧です。
属性 | 説明 | 種類 |
---|---|---|
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 の文字列と同様、配列も既定では可変長です。 データをシリアル化したりファイルに書き込んだりする際に、この属性が役立ちます。
関連項目
.NET