C# 属性
属性 は、実行時にプログラム内のさまざまな要素 (クラス、メソッド、構造体、列挙、コンポーネントなど) の動作情報を渡すために使用される宣言タグです。属性を使用して、宣言的な情報をプログラムに追加できます。宣言タグは、適用される要素の前に置かれた角括弧 ([ ]) によって記述されます。
属性は、コンパイラ命令やコメント、説明、メソッド、クラス、その他の情報などのメタデータを追加するために使用されます。 .Net Framework は、事前定義機能とカスタム機能という 2 種類の機能を提供します。
属性を指定する (Attribute)
属性 (Attribute) を指定する構文は次のとおりです。
[attribute(positional_parameters, name_parameter = value, ...)] element
属性 (Attribute) の名前と値は、適用される要素の前に角括弧内に配置して指定します。 Positional_parameters は必須の情報を指定し、name_parameter はオプションの情報を指定します。
事前定義された属性 (Attribute)
.Net フレームワークには、次の 3 つの事前定義された属性が用意されています。年齢
- 定義済み属性
- AttributeUsage
説明 カスタム属性の使用方法属性クラス。機能を適用できる項目のタイプを指定します。
この機能を指定するための構文は次のとおりです: [AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited )]
ここで:
パラメータ validon は、機能を配置できる言語要素を指定します。列挙子
AttributeTargets の値の組み合わせです。デフォルト値は
です。
パラメーター
allowmultiple(オプション) は、機能の
AllowMultipleプロパティにブール値を提供します。 true の場合、属性は多目的です。デフォルト値は false (1 回のみ使用) です。
パラメータ inherited (オプション) この機能の Inherited プロパティにブール値を提供します。 true の場合、この属性は派生クラスによって継承できます。デフォルト値は false (継承されません) です。
例:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
Conditional この事前定義された属性は、その実行が先頭のプリプロセッサ識別子に依存する条件付きメソッドをマークします。- Debug
や Trace などの指定された値に応じて、メソッド呼び出しの条件付きコンパイルが発生します。たとえば、コードのデバッグ時に変数の値を表示します。 この機能を指定する構文は次のとおりです:
[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
この事前定義された属性は、使用すべきではないプログラム エンティティをマークします。これにより、特定のターゲット要素を破棄するようにコンパイラーに指示できます。たとえば、クラスで新しいメソッドが使用されているが、古いメソッドをクラス内に保持したい場合は、古いメソッドの代わりに新しいメソッドを使用する必要があるというメッセージを表示して、そのメソッドを廃止としてマークできます。 )。 この機能を指定する構文は次のとおりです: [Obsolete(
message
)]
[Obsolete(
message,
iserror
)]
ここで:
パラメーター
messageは、項目が廃止された理由と代わりに何を使用するかを説明する文字列です。
パラメーター
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 フレームワークでは、実行時に取得できる宣言情報を保存するカスタム属性を作成できます。この情報は、設計基準とアプリケーションのニーズに基づいて、任意のターゲット要素に関連付けることができます。
カスタム プロパティの作成と使用は、次の 4 つの手順で構成されます:
カスタム プロパティの宣言
カスタム プロパティの構築
ターゲット プログラム要素へのカスタム プロパティの適用
リフレクションを介したプロパティへのアクセス
最後のステップでは、さまざまなシンボルを見つけるためにメタデータを読み取る簡単なプログラムを作成します。メタデータは、他のデータを説明するために使用されるデータおよび情報です。プログラムは、実行時にプロパティにアクセスするためにリフレクションを使用する必要があります。これについては次の章で詳しく説明します。
カスタム属性の宣言
新しいカスタム属性は、System.Attribute クラスから派生する必要があります。例:
// 一个自定义特性 BugFix 被赋给类及其成员 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
上記のコードでは、DeBugInfoというカスタム属性を宣言しました。
カスタム プロパティを構築する
デバッガーによって取得された情報を保存する DeBugInfo というカスタム プロパティを構築しましょう。次の情報が保存されます:
バグのコード番号
バグを特定した開発者の名前
コードが最後にレビューされた日付
開発者タグ
私たちの DeBugInfo クラスには、最初の 3 つの情報を保存するための 3 つのプライベート プロパティ (プロパティ) と、メッセージを保存するための 1 つのパブリック プロパティ (プロパティ) があります。したがって、バグ番号、開発者名、レビュー日は DeBugInfo クラスの必須の位置パラメーターとなり、メッセージはオプションの名前付きパラメーターになります。
各機能には少なくとも 1 つのコンストラクターが必要です。必須の位置パラメータはコンストラクターを介して渡す必要があります。次のコードは、DeBugInfo クラスを示しています:
// 一个自定义特性 BugFix 被赋给类及其成员 [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 { // 成员变量 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 クラス オブジェクトを使用してこの情報を取得します。