.NETプラットフォーム、したがってVisual Basicでは、属性はメタデータでさまざまなコード要素を注釈付けするための強力な手段として導入されました。これにより、実行時およびコンパイル時にプログラムやツールが追加情報を取得し、リフレクション、シリアライゼーション、テスト自動化などのメカニズムを通じてメソッド、クラス、プロパティの動作を調整できます。
属性がなければ、メソッドやクラスの設定のために余分なロジックをハードコーディングする必要があり、汎用ライブラリはクラスやメソッドに関する外部情報なしでは拡張可能で柔軟ではありません。また、コード自体を変更することなく設定を渡すことができないという問題も発生します。
属性は、Attributeの特別な派生クラスです。これらはメソッド、クラス、プロパティ、パラメータ、または戻り値に対して作成および適用できます。実行時には、リフレクションを通じてこれらの属性を検出し、関連するロジックの動作を変更できます。
自分の属性を作成し使用するコード例:
Imports System <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method, AllowMultiple:=False)> Public Class InfoAttribute Inherits Attribute Public Property Description As String Public Sub New(desc As String) Description = desc End Sub End Class <Info("特別なビジネスロジックメソッドです。")> Public Sub Calculate() Console.WriteLine("計算が行われました。") End Sub ' リフレクションを通じて属性を読み取る Dim method = GetType(Module1).GetMethod("Calculate") Dim attr = CType(Attribute.GetCustomAttribute(method, GetType(InfoAttribute)), InfoAttribute) If attr IsNot Nothing Then Console.WriteLine(attr.Description)
主な特徴:
AttributeTargets.Class、Method、Propertyなど)に適用可能属性はリフレクションを使用せずにメソッドやクラスの動作を直接変更できますか?
いいえ、属性自体はメタデータのみを含みます。オブジェクトの動作を変更できるのは、呼び出しコードまたはランタイムがリフレクションを通じて属性の存在を確認し、追加のアクションを取る場合のみです。
同じ属性を同じ要素に複数回割り当てることはできますか、そのためには何が必要ですか?
デフォルトではできません。属性を宣言する際にAllowMultiple:=TrueをAttributeUsageに指定する必要があります。そうすれば、同じ属性を同じ要素に複数回適用できます。
属性は基本クラスから派生クラスに継承されますか?
いいえ、デフォルトでは継承されません。継承が必要な場合は、AttributeUsageにInherited:=Trueと指定する必要があります。
プロジェクト内でメソッドにカスタム属性が広く配置されていますが、誰もこれらの属性をリフレクションで処理する実装をしていません — そのようなコードは無駄な負担となり、保守を困難にし、ソースコードの読みやすさを増すだけです。
利点:
欠点:
属性がロギングメソッドを注釈付けするために使用され、別のサブシステムがリフレクションを通じて自動的に監査対象のメソッドを特定し、分析を挿入し、トレースを追加します。ユーザーにとって動作が透明です。
利点:
欠点: