このトピックでは、Visual Basic プログラムで最もよく使用される属性について説明します。
グローバル属性
ほとんどの属性は、クラスやメソッドなどの特定の言語要素に適用されます。ただし、一部の属性はグローバルであり、アセンブリまたはモジュール全体に適用されます。 たとえば、 AssemblyVersionAttribute 属性を使用して、次のようにバージョン情報をアセンブリに埋め込むことができます。
<Assembly: AssemblyVersion("1.0.0.0")>
グローバル属性は、最上位レベルの Imports ステートメントの後、および型、モジュール、または名前空間の宣言の前に、ソース コードに表示されます。 グローバル属性は複数のソース ファイルに含めることができますが、ファイルは 1 つのコンパイル パスでコンパイルする必要があります。 Visual Basic プロジェクトの場合、グローバル属性は通常、AssemblyInfo.vb ファイルに配置されます (Visual Studio でプロジェクトを作成すると、ファイルが自動的に作成されます)。
アセンブリ属性は、アセンブリに関する情報を提供する値です。 これらは次のカテゴリに分類されます。
アセンブリ ID 属性
情報属性
アセンブリ マニフェスト属性
アセンブリ ID 属性
アセンブリの ID は、名前、バージョン、カルチャの 3 つの属性 (該当する場合は厳密な名前) によって決まります。 これらの属性はアセンブリの完全な名前を形成し、コードで参照するときに必要です。 属性を使用して、アセンブリのバージョンとカルチャを設定できます。 ただし、名前の値は、アセンブリ マニフェストを含むファイルに基づいて、アセンブリの作成時にコンパイラ、 アセンブリ情報ダイアログ ボックスの Visual Studio IDE、またはアセンブリ リンカー (Al.exe) によって設定されます。 AssemblyFlagsAttribute属性は、アセンブリの複数のコピーを共存できるかどうかを指定します。
次の表に、ID 属性を示します。
| 特性 | 目的 |
|---|---|
| AssemblyName | アセンブリの ID を完全に記述します。 |
| 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に適用される属性コンストラクターの 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 属性は 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 属性がある場合、少なくとも 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 属性は、属性クラスの定義にも適用できます。 この例では、カスタム属性 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
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 文字列と同様に、配列は既定で可変長です。 この属性は、ファイルにデータをシリアル化または書き込むときに便利です。
こちらも参照ください
.NET