C# 属性
属性は、実行時にプログラム内のさまざまな要素 (クラス、メソッド、構造体、列挙、コンポーネントなど) の動作情報を伝えるために使用される宣言タグです。属性を使用して、宣言的な情報をプログラムに追加できます。宣言タグは、適用される要素の前に置かれた角括弧 ([ ]) によって記述されます。
属性は、コンパイラ命令やコメント、説明、メソッド、クラス、その他の情報などのメタデータを追加するために使用されます。 .Net Framework は、定義済み属性とカスタム属性という 2 種類の属性を提供します。
属性を指定する (Attribute)
属性 (Attribute) を指定するための構文は次のとおりです。
[attribute(positional_parameters, name_parameter = value, ...)] element
属性 (Attribute) の名前と値は、適用される要素の前に角括弧内に配置して指定します。 Positional_parameters は必須の情報を指定し、name_parameter はオプションの情報を指定します。
定義済み属性 (属性)
.Net フレームワークには、次の 3 つの定義済み属性が用意されています。
AttributeUsage
Conditional
Obsolete
AttributeUsage
定義済み属性 AttributeUsage は、カスタム属性クラスの使用方法を説明します。機能を適用できる項目のタイプを指定します。
この機能を指定するための構文は次のとおりです:
[AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited )]
ここで:
パラメータ validon は、機能を配置できる言語要素を指定します。これは列挙子 AttributeTargets の値の組み合わせです。デフォルト値は AttributeTargets.All です。
パラメータallowmultiple (オプション)は、機能のAllowMultipleプロパティにブール値を提供します。 true の場合、属性は多目的です。デフォルト値は false (1 回のみ使用) です。
継承されたパラメーター (オプション) は、この機能の Inherited プロパティのブール値を提供します。 true の場合、この属性は派生クラスによって継承できます。デフォルト値は false (継承されません) です。
例:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Feild | 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 )]
ここで:
パラメータ メッセージは、プロジェクトが廃止された理由と代わりに何を使用するかを説明する文字列です。
パラメータ 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
カスタム属性 (Attribute) を作成します。
.Net Framework では、カスタム属性 (Attribute) を作成できます。属性は、実行時に取得できる宣言情報を保存するために使用されます。この情報は、設計基準とアプリケーションのニーズに基づいて、任意のターゲット要素に関連付けることができます。
创建并使用自定义特性包含四个步骤:
声明自定义特性
构建自定义特性
在目标程序元素上应用自定义特性
通过反射访问特性
最后一个步骤包含编写一个简单的程序来读取元数据以便查找各种符号。元数据是用于描述其他数据的数据和信息。该程序应使用反射来在运行时访问特性。我们将在下一章详细讨论这点。
声明自定义特性
一个新的自定义特性应派生自 System.Attribute 类。例如:
// 一个自定义特性 BugFix 被赋给类及其成员 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
在上面的代码中,我们已经声明了一个名为 DeBugInfo 的自定义特性。
构建自定义特性
让我们构建一个名为 DeBugInfo 的自定义特性,该特性将存储调试程序获得的信息。它存储下面的信息:
bug 的代码编号
辨认该 bug 的开发人员名字
最后一次审查该代码的日期
一个存储了开发人员标记的字符串消息
我们的 DeBugInfo 类将带有三个用于存储前三个信息的私有属性(property)和一个用于存储消息的公有属性(property)。所以 bug 编号、开发人员名字和审查日期将是 DeBugInfo 类的必需的定位( positional)参数,消息将是一个可选的命名(named)参数。
每个特性必须至少有一个构造函数。必需的定位( positional)参数应通过构造函数传递。下面的代码演示了 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()); } }
以上就是【c#教程】C# 特性(Attribute)的内容,更多相关内容请关注PHP中文网(www.php.cn)!