C#のコードを見ていると、クラスやメソッドの上に [ ... ] で囲まれた記述を見かけることがあります。これは「属性(Attribute)」と呼ばれる仕組みで、最初は見た目だけでは何をしているのか分かりにくい部分でもあります。
Attributeは一言で言うと、コードに追加の意味や情報を与えるための仕組みです。処理そのものを書くのではなく、「このコードはこういう性質を持っている」「こう扱ってほしい」といったメタ情報を付与する役割を持っています。
Attributeとは何か
基本的な形は次のようになります。
[Something]
class MyClass
{
}
この [Something] がAttributeです。
これは「MyClassに対して何らかの意味付けをしている」という宣言になります。
ここで重要なのは、Attributeは処理ではなく“情報”である という点です。
Attributeの役割
Attributeは主に次の3つの用途で使われます。
① コンパイラへの指示
[Obsolete]
この属性が付いたメソッドを使うと、コンパイラが警告を出します。 つまり、「このメソッドは古いので使わないでほしい」という意図をコードに埋め込んでいます。
② ランタイムへのヒント
[Serializable]
このような属性は、実行時に「このクラスはシリアライズ可能である」という情報として扱われます。
③ 外部システムとの連携
[DllImport("user32.dll")]
これはネイティブDLLの関数を呼び出すための設定です。 Attributeによって、CLRの動作そのものが変わります。
Attributeの正体
Attributeは特別な構文に見えますが、実体は単なるクラスです。
class DllImportAttribute : Attribute
{
}
そして、
[DllImport]
は省略形で、実際には:
[DllImportAttribute]
と同じ意味です。
どこに付けられるのか
Attributeはさまざまな場所に付けることができます。
[ClassAttr]
class A
{
[FieldAttr]
int x;
[MethodAttr]
void Foo() {}
[return: Attr] int Bar() => 0;
Attributeの構文
[AttributeName(引数, 名前付き引数)]
例:
[DllImport("user32.dll", SetLastError = true)]
"user32.dll"→ コンストラクタ引数SetLastError = true→ プロパティ指定
自作Attribute
Attributeは自分で定義することもできます。
class MyAttribute : Attribute
{
public string Name { get; }
public MyAttribute(string name)
{
Name = name;
}
}
使う側:
[My("test")]
class Sample {}
重要な理解
Attributeについて最も重要なのはこれです。
Attributeはそれ単体では何もしない
単なる情報に過ぎない
誰かが解釈して初めて意味を持つ
| 解釈者 | 例 |
|---|---|
| コンパイラ | Obsolete |
| CLR | StructLayout |
| フレームワーク | ASP.NET Route |
| 自作コード | Reflection |
まとめ
Attributeとは、コードに対して追加の意味や設定を付与するための仕組みです。 処理そのものではなく、「どう扱うべきか」という情報を宣言的に記述するものです。
重要なのは、Attributeは“情報”であり、単体では何も起こらない という点です。この情報をどう使うかは、次に説明するReflectionとセットで理解する必要があります。