C# - 属性
属性 プログラム内のクラス、メソッド、構造体、列挙子、アセンブリなどのさまざまな要素の動作に関する情報をランタイムに伝えるために使用される宣言タグです。属性を使用して、宣言情報をプログラムに追加できます。宣言タグは、それが使用される要素の上に配置された角括弧 ([ ]) によって表されます。
属性は、コンパイラ命令などのメタデータや、コメント、説明、メソッド、クラスなどのその他の情報をプログラムに追加するために使用されます。 .Net Framework は 2 種類の属性を提供します:定義済み 属性と特注
属性の指定
属性を指定するための構文は次のとおりです −
[attribute(positional_parameters, name_parameter = value, ...)] element
属性の名前とその値は、属性が適用される要素の前の角括弧内に指定されます。位置パラメータは必須情報を指定し、名前パラメータはオプション情報を指定します。
事前定義された属性
.Net Framework は 3 つの事前定義された属性を提供します −
- 属性の使用法
- 条件付き
- 時代遅れ
属性の使用法
定義済みの属性 AttributeUsage カスタム属性クラスの使用方法について説明します。属性を適用できるアイテムのタイプを指定します。
この属性を指定するための構文は次のとおりです −
[AttributeUsage ( validon, AllowMultiple = allowmultiple, Inherited = inherited )]
どこで、
-
パラメータ validon は、属性を配置できる言語要素を指定します。列挙子 AttributeTargets の値の組み合わせです .デフォルト値は AttributeTargets.All です。 .
-
パラメータ allowmultiple (オプション) AllowMultiple の値を提供します この属性のプロパティ、ブール値。これが true の場合、属性は多用途です。デフォルトは false (使い捨て) です。
-
パラメータ inherited (オプション) は、Inherited の値を提供します。 この属性のプロパティ、ブール値。 true の場合、属性は派生クラスに継承されます。デフォルト値は false (継承されません) です。
たとえば、
[AttributeUsage( AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
条件付き
この事前定義された属性は、実行が指定された前処理識別子に依存する条件付きメソッドをマークします。
Debug などの指定された値に応じて、メソッド呼び出しの条件付きコンパイルが発生します。 または トレース .たとえば、コードのデバッグ中に変数の値を表示します。
この属性を指定するための構文は次のとおりです −
[Conditional( conditionalSymbol )]
たとえば、
[Conditional("DEBUG")]
次の例は、属性を示しています −
ライブデモ#define DEBUG using System; using System.Diagnostics; public class Myclass { [Conditional("DEBUG")] public static void Message(string msg) { Console.WriteLine(msg); } } class Test { static void function1() { Myclass.Message("In Function 1."); function2(); } static void function2() { Myclass.Message("In Function 2."); } public static void Main() { Myclass.Message("In Main function."); function1(); Console.ReadKey(); } }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
In Main function In Function 1 In Function 2
時代遅れ
この事前定義された属性は、使用してはならないプログラム エンティティを示します。特定のターゲット要素を破棄するようにコンパイラに通知できます。たとえば、新しいメソッドがクラスで使用されていて、クラスで古いメソッドを保持したい場合は、古いメソッドの代わりに新しいメソッドを使用する必要があるというメッセージを表示して、古いメソッドを廃止としてマークすることができます。
この属性を指定するための構文は次のとおりです −
[Obsolete ( message )] [Obsolete ( message, iserror )]
どこで、
-
パラメータ メッセージ 、アイテムが廃止された理由と代わりに何を使用するかを説明する文字列です。
-
パラメータ iserror 、ブール値です。その値が true の場合、コンパイラは項目の使用をエラーとして処理する必要があります。デフォルト値は false です (コンパイラは警告を生成します)。
次のプログラムはこれを示しています −
using System; public class MyClass { [Obsolete("Don't use OldMethod, use NewMethod instead", true)] static void OldMethod() { Console.WriteLine("It is the old method"); } static void NewMethod() { Console.WriteLine("It is the new method"); } public static void Main() { OldMethod(); } }
プログラムをコンパイルしようとすると、コンパイラは次のようなエラー メッセージを表示します −
Don't use OldMethod, use NewMethod instead
カスタム属性の作成
.Net Framework では、宣言的な情報を格納するために使用でき、実行時に取得できるカスタム属性を作成できます。この情報は、設計基準とアプリケーションのニーズに応じて、任意のターゲット要素に関連付けることができます。
カスタム属性の作成と使用には 4 つのステップが含まれます −
- カスタム属性の宣言
- カスタム属性の構築
- ターゲット プログラム要素にカスタム属性を適用する
- リフレクションによる属性へのアクセス
最後のステップでは、メタデータを読み取ってさまざまな表記法を見つける簡単なプログラムを作成します。メタデータは、データに関するデータまたは他のデータを記述するために使用される情報です。このプログラムは、実行時に属性にアクセスするためにリフレクションを使用する必要があります。これについては、次の章で説明します。
カスタム属性の宣言
新しいカスタム属性は System.Attribute から派生する必要があります クラス。たとえば、
//a custom attribute BugFix to be assigned to a class and its members [AttributeUsage( AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
上記のコードでは、DeBugInfo という名前のカスタム属性を宣言しました。 .
カスタム属性の構築
DeBugInfo という名前のカスタム属性を作成しましょう には、任意のプログラムをデバッグして得られた情報が格納されます。次の情報を保存させてください −
- バグのコード番号
- バグを特定した開発者の名前
- コードの最終レビュー日
- 開発者のコメントを保存するための文字列メッセージ
DeBugInfo クラスには、最初の 3 つの情報を格納するための 3 つのプライベート プロパティと、メッセージを格納するためのパブリック プロパティがあります。したがって、バグ番号、開発者の名前、およびレビューの日付は DeBugInfo クラスの位置パラメーターであり、メッセージはオプションまたは名前付きパラメーターです。
各属性には少なくとも 1 つのコンストラクターが必要です。位置パラメーターは、コンストラクターを介して渡す必要があります。次のコードは DeBugInfo を示しています クラス−
//a custom attribute BugFix to be assigned to a class and its members [AttributeUsage( AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute { private int bugNo; private string developer; private string lastReview; public string message; public DeBugInfo(int bg, string dev, string d) { this.bugNo = bg; this.developer = dev; this.lastReview = d; } public int BugNo { get { return bugNo; } } public string Developer { get { return developer; } } public string LastReview { get { return lastReview; } } public string Message { get { return message; } set { message = value; } } }
カスタム属性の適用
属性は、ターゲットの直前に配置することで適用されます −
[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")] [DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")] class Rectangle { //member variables protected double length; protected double width; public Rectangle(double l, double w) { length = l; width = w; } [DeBugInfo(55, "Zara Ali", "19/10/2012", Message = "Return type mismatch")] public double GetArea() { return length * width; } [DeBugInfo(56, "Zara Ali", "19/10/2012")] public void Display() { Console.WriteLine("Length: {0}", length); Console.WriteLine("Width: {0}", width); Console.WriteLine("Area: {0}", GetArea()); } }
次の章では、Reflection クラス オブジェクトを使用して属性情報を取得します。
C言語