C#には「アノテーション」と呼ばれる機能があります。正式には「属性(Attribute)」と呼ばれ、コードにメタデータを付加する重要な仕組みです。これにより、クラスやメソッド、プロパティに意味や動作のヒントを加えることができます。本記事では、C#のアノテーションの基本的な使い方から、独自属性の作成、実践的な使用例までを解説します。これからC#を深く学びたい方、またはリーダブルで効率的なコードを書くためにアノテーションを活用したい方におすすめです。
アノテーションとは、プログラムの構造要素に対して追加情報を付けるための仕組みです。C#ではこれを「属性(Attribute)」と呼びます。
[Serializable]
public class Person
{
public string Name { get; set; }
}
上記のように、[Serializable]
はPerson
クラスがシリアライズ可能であることを示す属性です。属性は角括弧[]
を使って記述され、コンパイラやランタイムにメタ情報を提供します。
古くなったAPIに対して、この属性を使うことで、利用者に警告を表示できます。
[Obsolete("このメソッドは古いです。NewMethodを使用してください。")]
public void OldMethod() { }
クラスにこの属性を付けると、バイナリやXMLなどの形式でシリアライズできます。
[Serializable]
public class Product
{
public int Id;
public string Name;
}
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() { }
このように、文字列メッセージやブール値などを渡すことで、より詳細な情報や挙動を指定できます。
public class MyCustomAttribute : Attribute
{
public string Info { get; }
public MyCustomAttribute(string info)
{
Info = info;
}
}
[MyCustom("これはカスタム属性です")]
public class SampleClass { }
var attr = (MyCustomAttribute)Attribute.GetCustomAttribute(typeof(SampleClass), typeof(MyCustomAttribute));
Console.WriteLine(attr.Info);
独自属性は、開発チーム内でのルール付けや自動処理のトリガーとして活用できます。
[TestClass]
public class CalculatorTests
{
[TestMethod]
public void AddTest()
{
Assert.AreEqual(4, Calculator.Add(2, 2));
}
}
[HttpGet("api/products/{id}")]
public IActionResult GetProduct(int id)
{
//...
}
このように、属性を使うことでコードの挙動や構成を柔軟に指定でき、保守性も向上します。
作成した属性に対して、どの種類のコードに適用できるかを制限することもできます。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyCustomAttribute : Attribute { }
この例では、クラスとメソッドにのみ適用できるよう制限されています。
C#のアノテーション(属性)は、ただの飾りではありません。コードに情報を付与し、さまざまな処理や動作をコントロールする重要な手段です。標準の属性に慣れてきたら、ぜひ独自属性の作成にも挑戦してみてください。リフレクションと組み合わせることで、より動的で柔軟なアプリケーションが構築できます。