Categories: Cシャープ

C#のアノテーション(属性)を徹底解説!基本から応用まで理解しよう

C#には「アノテーション」と呼ばれる機能があります。正式には「属性(Attribute)」と呼ばれ、コードにメタデータを付加する重要な仕組みです。これにより、クラスやメソッド、プロパティに意味や動作のヒントを加えることができます。本記事では、C#のアノテーションの基本的な使い方から、独自属性の作成、実践的な使用例までを解説します。これからC#を深く学びたい方、またはリーダブルで効率的なコードを書くためにアノテーションを活用したい方におすすめです。


C#におけるアノテーション(属性)とは?

アノテーションとは、プログラムの構造要素に対して追加情報を付けるための仕組みです。C#ではこれを「属性(Attribute)」と呼びます。

[Serializable]
public class Person
{
public string Name { get; set; }
}

上記のように、[Serializable]Personクラスがシリアライズ可能であることを示す属性です。属性は角括弧[]を使って記述され、コンパイラやランタイムにメタ情報を提供します。


よく使われる標準アノテーション(属性)

[Obsolete] – 非推奨の機能に警告を出す

古くなったAPIに対して、この属性を使うことで、利用者に警告を表示できます。

[Obsolete("このメソッドは古いです。NewMethodを使用してください。")]
public void OldMethod() { }

[Serializable] – シリアライズ可能であることを示す

クラスにこの属性を付けると、バイナリやXMLなどの形式でシリアライズできます。

[Serializable]
public class Product
{
public int Id;
public string Name;
}

[Required] や [Range] – データバリデーション

ASP.NET MVCやEntity Frameworkなどでよく使われる属性です。

public class Order
{
[Required]
public string CustomerName { get; set; }

[Range(1, 100)]
public int Quantity { get; set; }
}

属性の適用対象と複数指定

属性は、クラス、メソッド、プロパティ、フィールド、パラメータなどに適用できます。

[Obsolete]
[Serializable]
public class MyClass
{
[NonSerialized]
private int _id;

[Required]
public string Name { get; set; }
}

複数の属性を同時に指定する際は、カンマで区切って1つの[]内に記述することもできます。


属性に引数を渡す方法

属性にはコンストラクタやプロパティを使って引数を渡すことができます。

[Obsolete("この関数は非推奨です", true)]
public void DeprecatedFunction() { }

このように、文字列メッセージやブール値などを渡すことで、より詳細な情報や挙動を指定できます。


独自アノテーション(カスタム属性)の作成方法

1. Attribute クラスを継承する

public class MyCustomAttribute : Attribute
{
public string Info { get; }

public MyCustomAttribute(string info)
{
Info = info;
}
}

2. 属性を付けて使う

[MyCustom("これはカスタム属性です")]
public class SampleClass { }

3. 属性をリフレクションで取得

var attr = (MyCustomAttribute)Attribute.GetCustomAttribute(typeof(SampleClass), typeof(MyCustomAttribute));
Console.WriteLine(attr.Info);

独自属性は、開発チーム内でのルール付けや自動処理のトリガーとして活用できます。


アノテーション活用の実例

ユニットテスト用属性 [TestMethod]

[TestClass]
public class CalculatorTests
{
[TestMethod]
public void AddTest()
{
Assert.AreEqual(4, Calculator.Add(2, 2));
}
}

ASP.NET Core のルーティング

[HttpGet("api/products/{id}")]
public IActionResult GetProduct(int id)
{
//...
}

このように、属性を使うことでコードの挙動や構成を柔軟に指定でき、保守性も向上します。


属性の制限:AttributeUsage

作成した属性に対して、どの種類のコードに適用できるかを制限することもできます。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyCustomAttribute : Attribute { }

この例では、クラスとメソッドにのみ適用できるよう制限されています。


まとめ:アノテーションを理解するとC#がもっと便利に

C#のアノテーション(属性)は、ただの飾りではありません。コードに情報を付与し、さまざまな処理や動作をコントロールする重要な手段です。標準の属性に慣れてきたら、ぜひ独自属性の作成にも挑戦してみてください。リフレクションと組み合わせることで、より動的で柔軟なアプリケーションが構築できます。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。