属性 (Attribute)

属性とは、コード要素に情報を追加するための言語構造です。これには次の2つの形式があります。

  1. CLRに定義されている属性
  2. ユーザーが作成するカスタム属性
グループ別の属性 - Visual C++ 属性リファレンス | MSDN

属性クラス (Attribute Class)

属性を定義するには、System.Attributeクラスを継承したクラスを使用します。

要素の属性を指定するには、属性の名前として型の名前を使います。このとき型名のサフィックスAttributeは省略できます。また引数を持たない場合は、かっこも省略できます。従って以下の4つは、同等の意味を持ちます。

  • [ Serializable ]
  • [ Serializable() ]
  • [ SerializableAttribute ]
  • [ SerializableAttribute() ]

属性パラメータ (Attribute Parameters)

属性によってはパラメータを渡せるものがあります。

[ 属性クラス( 位置パラメータ, 名前付きパラメータ =  ) ]
パラメータの種類 渡される先
位置パラメータ 属性クラスのコンストラクタの引数
名前付きパラメータ 属性クラスのプロパティおよびフィールド

属性ターゲット (Attribute Targets)

通常は属性の適用される対象 (ターゲット) は、直後に続くコード要素です。しかし対象を明示的に指定することで、それを変更できます。

[ ターゲット : 属性クラス ]

ターゲットには次のキーワードを指定できます。

  • assembly
  • module
  • type
  • method
  • property
  • field
  • param
  • event
  • return

複数の属性の指定

1つのコード要素に複数の属性を指定するには、次のいずれかのように記述します。

[ 属性クラス1 ]
[ 属性クラス2 ]
[ 属性クラス1, 属性クラス2 ]

カスタム属性 (Custom Attributes)

メタデータ (データに関連する情報) を拡張します。これによって、コードに特別な情報を追加できます。

事前定義の属性

特別な扱いを受ける事前定義の属性
属性 説明
AttributeUsage 新しい属性をコンパイル時にどのように扱うかを指定
Conditional 指定のsymbolをコード内に定義していない場合に、そのメソッドへの呼び出しを省略するようにコンパイラに指示
Obsolete そのターゲットが古くなっていて推奨されないことを示す
CLSCompliant CLSへの準拠を検証するかどうかをコンパイラに指示
Serializable ターゲットがシリアライズ可能であることを示す
NonSerialized ターゲットがシリアライズ不可能であることを示す

独自の属性を定義

System.Attributeクラスまたはその派生クラスから派生したクラスを作成することで、独自の属性を定義できます。

参考

参考書

MSDN (Microsoft Developer Network) から検索