Csharp-attributes
C#-属性
*attribute* は、クラス、メソッド、構造体、列挙子、アセンブリなどのさまざまな要素の動作に関する情報をランタイムに伝えるために使用される宣言タグです。 あなたのプログラムで。 属性を使用して、宣言情報をプログラムに追加できます。 宣言タグは、使用される要素の上に配置された角括弧([])で表されます。
属性は、コンパイラ命令などのメタデータや、コメント、説明、メソッド、クラスなどの他の情報をプログラムに追加するために使用されます。 .Net Frameworkは、2つのタイプの属性を提供します:事前定義された属性と_custom built_属性。
属性を指定する
属性を指定するための構文は次のとおりです-
[attribute(positional_parameters, name_parameter = value, ...)]
element
属性の名前とその値は、属性が適用される要素の前に、角括弧内で指定されます。 位置パラメータは必須情報を指定し、名前パラメータはオプション情報を指定します。
事前定義された属性
- AttributeUsage
- 条件付き
- 廃止された
AttributeUsage
事前定義された属性 AttributeUsage は、カスタム属性クラスの使用方法を説明しています。 属性を適用できるアイテムのタイプを指定します。
この属性を指定するための構文は次のとおりです-
[AttributeUsage (
validon,
AllowMultiple = allowmultiple,
Inherited = inherited
)]
どこで、
- パラメーターvalidonは、属性を配置できる言語要素を指定します。 列挙子_AttributeTargets_の値の組み合わせです。 デフォルト値は_AttributeTargets.All_です。
- パラメーター_allowmultiple_(オプション)は、この属性の_AllowMultiple_プロパティーの値(ブール値)を提供します。 これが当てはまる場合、属性は多目的です。 デフォルトはfalse(使い捨て)です。
- 継承されたパラメーター(オプション)は、この属性の_Inherited_プロパティの値、ブール値を提供します。 trueの場合、属性は派生クラスに継承されます。 デフォルト値はfalseです(継承されません)。
例えば、
[AttributeUsage(
AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
条件付き
この事前定義された属性は、実行が指定された前処理識別子に依存する条件付きメソッドをマークします。
*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 (
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 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クラスオブジェクトを使用して属性情報を取得します。