三つの編を補充するのはただ一つの特性です。

11375 ワード

http://www.cnblogs.com/liuxinxin/articles/2265672.htmlから回転
C〓〓の特性は詳しく説明します 
    特性は、ある声明に指定された付加的な声明情報である。
    C〓〓の中で、小さい定義の特性の集合があります。どのようにして私たち自身のカスタマイズ特性を確立するかを学ぶ前に、先に私たちのコードの中で定義された特性をどのように使うかを見てみます。
using System; 

 public class AnyClass 

 { 

     [Obsolete("Don't use Old method, use New method", true)] 

     static void Old( ) { }  

     static void New( ) { } 

     public static void Main( ) 

     { 

         Old( ); 

     } 

 }
 まず、上記の例を見てみます。この例では、Obsoluete特性を使用しています。これ以上使用すべきではないプログラムエンティティをマークしています。最初のパラメータは文字列であり、なぜエンティティが時代遅れであり、どのエンティティでそれを代替すべきかを説明している。実際には、ここでどんなテキストを書いてもいいです。第二のパラメータは、コンパイラがこの古いプログラムエンティティを使用することをエラーとして扱うべきだと教えています。そのデフォルトはfalseです。つまりコンパイラはこれに対して警告を与えます。
    上記のプログラムをコンパイルしようとすると、エラーが発生します。   
    AnyClass.Old()'is Osolite:'Don't use Old method,use New method'
 
カスタム特性の開発(custom atributes)
    私たち自身の特性を開発する方法を見てみましょう。     まず、私たちはSystem.Attributeから派生して、私たち自身の特性種類(System.Attribute抽象類から継承された類は直接にも間接的にも継承されて、いずれも特性種類になります。特性類の声明は声明の上に置くことができる新しい特性を定義しました)。
1 using System; 

2 public class HelpAttribute : Attribute 

3 { 

4 } 
あなたが信じているかどうかに関わらず、私達はすでにカスタムの特性を確立しました。今はそれを使って既存のクラスを飾ります。上のようにObsoliete atributeを使っています。
 
1 [Help()] 

2 public class AnyClass 

3 { 

4 } 
注意:特性クラス名にAttributeのサフィックスを使うのは慣例です。しかし、プログラムエンティティに特性を追加すると、Attributeの拡張子を含むかどうかは私たちの自由です。コンパイラはまずSystem.Attributeの派生クラスで追加された特性クラスを検索します。もし見つけられなかったら、コンパイラはAttributeの拡張子を追加して検索を続けます。
    今まで、この特性はまだ何の役割も果たしていません。私たちは何かを追加して、もっと使いやすいようにします。
 
using System; 

 public class HelpAttribute : Attribute 

 { 

     public HelpAttribute(String Descrition_in) 

     { 

         this.description = Description_in; 

     } 

     protected String description; 

     public String Description 

     { 

         get 

         { 

             return this.description; 

         } 

     } 

 } 

 [Help("this is a do-nothing class")] 

 public class AnyClass 

 { 

 }
上記の例では、私たちはHelpAttributeの特性クラスに属性を追加しました。そして、後続の部分に運行時の環境で調べます。
 
    定義または制御特性の使用
    AttributeUsageクラスはもう一つの定義済みの特性クラスであり、それは私たち自身のカスタマイズ特性の使用を制御するのに役立ちます。これはカスタマイズ特性を述べています。例えば、使われています。     AttributeUsageには三つの属性があります。カスタマイズ属性の前に置いてもいいです。最初の属性は: 
 
    Valid On     この属性により、カスタマイズ特性はどのプログラムエンティティの前に置くべきかを定義することができます。一つの属性が配置されても良い全てのプログラムエンティティがAttributeTargetenumeratorにリストされています。OR操作により、いくつかのAttributeTargets値を組み合わせることができます。
    AllowMultiple     この属性は、同じプログラムエンティティの前に複数回配置することができますか?
 
    Inheited     この特性を用いてカスタマイズ特性の継承則を制御することができる。私たちの特性が引き継がれるかどうかについてマークしました。
    これから実際のものを作りましょう。先ほどのHelp特性の前にAttributeUsage特性を置いて、Help特性の使用を制御することを期待します。
using System; 

 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 

 public class HelpAttribute : Attribute 

 { 

     public HelpAttribute(String Description_in) 

     { 

         this.description = Description_in; 

     } 

     protected String description; 

     public String Description 

     { 

         get 

         { 

             return this.description; 

         } 

     } 

 }
まず、AttributeTarget.classを見てみましょう。Help特性はクラスの前に置くしかないと規定しています。これは以下のコードにエラーが発生することを意味します。
[Help("this is a do-nothing class")] 

 public class AnyClass 

 { 

     [Help("this is a do-nothing method")] //error 

     public void AnyMethod() 

     { 

     } 

 }
 コンパイラレポートのエラーは以下の通りです。
    AnyClass.cs:Attribute'Help'is not valid on this declation type.     It is valid on'class'declarationly.  
 
    Help特性は任意のプログラムエンティティの前に配置されることを可能にするためにAttributeTarget.Allを使用することができる。可能な値は:
    Asmbly,Module,Class,Struct,Enum,Costruct,Method,Property,Field,Event,Interface,Parameter,Delegate
    All=Asembly Module𞓜Class(124;)Ent Eum Controuctor Methodヘルツ・オブ・ファイト
    Class Members=Class_Struct_Enum_Costruct_Method(124)Property(124)Field(124)Event_Delegate(124)Interface
 
    次にAllowMultiple=falseを考えます。これは特性を繰り返してはいけないと規定しています。
[Help("this is a do-nothing class")] 

 [Help("it contains a do-nothing method")] 

 public class AnyClass 

 { 

     [Help("this is a do-nothing method")] //error 

     public void AnyMethod() 

     { 

     } 

 }
コンパイル期間のエラーが発生しました。     AnyClass.cs:Duplicate'Help'atribute
    Ok,今から最後のこの属性について議論しましょう。Inheitedは、1つの基質に特性が置かれている場合、派生種に継承されるかどうかを示している。
 
[Help("BaseClass")] 

 public class Base 

 { 

 } 

 public class Derive : Base 

 { 

 }
ここでは4つの可能な組み合わせがあります。
 
1 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 
2 [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
3 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
4 [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
   
    第一の場合:
    もし私たちが(Query)を調べたら(あとでどのように運行期間でクラスの特性を調べますか?)Derive類はHelp特性が存在しないことを発見します。inherited属性はfalseに設定されています。
    第二の場合:
    最初の場合と同じです。inheritedもfalseに設定されています。
    第三の場合:
    第三の状況と第四の状況を説明するために、まず派生類にコードを追加します。
[Help("BaseClass")] 

 public class Base 

 { 

 } 

 [Help("DeriveClass")] 

 public class Derive : Base 

 { 

 }
 Help特性を調べてみます。派生タイプの属性しか得られません。inheritedはtrueに設定されていますが、AllowMultipleはfalseに設定されています。したがって、ベースクラスのHelp特性は、派生クラスのHelp特性によってカバーされている。
    第四の場合:
    ここでは、派生クラスには基本的なHelp特性があり、また独自のHelp特性があることを発見します。AllowMultipleはtrueに設定されています。
    AttributeUsageクラスを使用して特性を定義したり、制御したりします。これは私たち自身のカスタマイズ特性の使用を制御するのに役立ちます。これはカスタマイズ特性がどのように使用されるかを述べている。