Latest web development tutorials

C#のプロパティ(属性)

特性(属性)宣言型タグ情報の実行時の動作に(などのクラス、メソッド、構造体、列挙、コンポーネント、など)様々な要素を転送するためのプログラムです。あなたは機能を使用してプログラムに宣言情報を追加することができます。 文ラベルを記述するために、角括弧([])内の要素の前に置くことで適用されます。

(属性)の特徴は、そのようなようにコンパイラ命令とコメント、説明、方法、追加情報として、メタデータを追加します。定義済みのプロパティとカスタムプロパティ:.NET Frameworkが特徴の2種類が用意されています。

所定のプロパティ(属性)

所定のプロパティ(属性)の構文は次のとおりです。

[属性(positional_parameters、name_parameter =値、...)]
要素

特性(属性)の名前と値は、それが適用される要素の前に置かれ、角括弧内に指定されています。 positional_parametersが必要な所定の情報を、name_parameter任意の所定の情報を。

定義済みの属性(属性)

.NET Frameworkは、3つの定義済みの属性が用意されています。

  • AttributeUsage
  • 条件付きの
  • 廃止されました

AttributeUsage

事前定義済みAttributeUsageは、カスタム属性クラスを使用する方法について説明します属性。 これは、プロパティの種類がプロジェクトに適用することができる特定します。

この機能の規定の構文は次のとおりです。

[AttributeUsage(
   validon、
   AllowMultiple = allowmultiple、
   継承=継承
)]

ここで:

  • Validon特性言語要素を配置することができるパラメータを所定。 これは、列挙子AttributeTargets値の組み合わせです。 デフォルト値はAttributeTargets.Allです
  • パラメータallowmultiple(オプション)は 、プロパティAllowMultipleプロパティ (プロパティ)のためのブール値を提供します。 trueの場合、この機能はより有用です。 デフォルト値はfalse(単回使用​​)です。
  • パラメータ(オプション)継承されたプロパティ継承プロパティ(プロパティ)のためのブール値を提供します。 trueの場合、このプロパティは、派生クラスを継承することが可能です。 デフォルト値はfalseです(継承されません)。

例えば:

【AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property、 
AllowMultiple =真)]

条件付きの

この機能は、その実装がトップ前処理識別子に依存し、所定の条件のメソッドをマークします。

このようなデバッグやトレースなどの指定した値に応じて、メソッド呼び出しの条件付きコンパイルの原因となります コードをデバッグするときたとえば、変数の値が表示されます。

この機能の規定の構文は次のとおりです。

[条件(
   conditionalSymbol
)]

例えば:

[条件( "DEBUG")]

次の例では、この機能を示しています。

#define DEBUG
システムを用いました。
たSystem.Diagnosticsを使用しました。
公共MyClassクラス
{
    [条件( "DEBUG")]
    パブリック静的ボイドメッセージ(文字列MSG)
    {
        Console.WriteLineを(MSG)。
    }
}
クラスTest
{
    静的な無効関数1()
    {
        Myclass.Message(「ファンクション1で ");
        機能2()。
    }
    静的な無効機能2()
    {
        Myclass.Message(「ファンクション2では ");
    }
    公共の静的な無効メイン()
    {
        Myclass.Message(「メイン機能では。 ");
        関数1();
        Console.ReadKey()。
    }
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

主な機能には
機能1で
機能2で

廃止されました

プログラムの実体をタグ付けされた定義済みの属性を使用するべきではありません。 それはあなたが特定のターゲット要素を破棄するようにコンパイラに指示することができます。 たとえば、新しいメソッドをクラスで使用する場合、しかし、あなたはまだ古い方法でクラスを維持したい、あなたは新しいメソッドが廃止された(時代遅れとしてそれをマークするために、メッセージの古い方法の代わりに使用する必要があります表示することができますA)。

この機能の規定の構文は次のとおりです。

[廃止されました(
   メッセージ
)]
[廃止されました(
   メッセージ、
   ISERROR
)]

ここで:

  • パラメータメッセージは、プロジェクトだけでなく、時代遅れの代替が使用するどのような理由を説明する文字列です。
  • パラメータISERRORは、ブール値です。 trueの場合、コンパイラは間違いとして、プロジェクトを使用する必要があります。 デフォルト値は(コンパイラが警告を生成します)falseです。

次の例では、この機能を示しています。

システムを用いました。
公共MyClassクラス
{
   [廃止(真、「代わりにNewMethodを使用し、OldMethodを使用しないでください ")]
   静的な無効OldMethod()
   { 
      Console.WriteLineを( "それは古い方法です");
   }
   静的な無効NewMethod()
   { 
      Console.WriteLineを( "これは新しい方法です"); 
   }
   公共の静的な無効メイン()
   {
      OldMethod()。
   }
}

あなたがプログラムをコンパイルしようとすると、コンパイラはというエラーメッセージを表示します:

 代わりにNewMethodを使用し、OldMethodを使用しないでください

作成カスタム属性(属性)

.NET Frameworkは、あなたが宣言情報を格納するためのカスタムプロパティを作成することができ、実行時に取得することができます。 この情報は、設計基準に基づいており、アプリケーションが任意のターゲット要素に関連付けする必要があります。

作成し、使用するカスタム機能には4つのステップが含まれます。

  • ステートメントのカスタムプロパティ
  • カスタムプロパティを構築
  • ターゲットプログラム要素のカスタムプロパティを適用します
  • 反射特性を介したアクセス

最後のステップは、様々なシンボルを見つけるためにメタデータを読み込むための簡単なプログラムを書く含まれています。 メタデータは、他のデータを記述するために使用されるデータおよび情報です。 プログラムは、実行時にプロパティにアクセスするためにリフレクションを使用する必要があります。 私たちは、次の章で詳細にこれを説明します。

ステートメントのカスタムプロパティ

System.Attributeクラスから派生する新しいカスタムプロパティ。例えば:

//バグ修正カスタム属性は、クラスに割り当てられ、そのメンバー[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property、
AllowMultiple =真)]

パブリッククラスDEBUGINFO:System.Attribute

上記のコードでは、我々はDEBUGINFOという名前のカスタム属性を宣言しています。

カスタムプロパティを構築

私たちはDEBUGINFOという名前のカスタム属性を構築してみましょう情報が得られる特徴デバッガに保存されます。 これは、以下の情報を格納します。

  • バグコード番号
  • 開発者は、バグの名前を認識します
  • コードの最後のレビュー日
  • 文字列メッセージストアの開発者マーク

私たちのDEBUGINFO最初の3つのクラスが(プロパティ)のためのメッセージを格納するための3つの私有財産情報(プロパティ)を格納するために使用され、公共の財産となります。 だからバグ番号の開発者名とレビューの日付が要求される測位DEBUGINFOクラス(位置)パラメータは、メッセージはオプション名(名前付き)のパラメータです。

各プロパティには、少なくとも1つのコンストラクタを持っている必要があります。 必要なポジショニングコンストラクタによって渡される必要があります(位置)パラメータ。 次のコードは、DEBUGINFOカテゴリを示しています。

//バグ修正カスタム属性は、クラスに割り当てられ、そのメンバー[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property、
AllowMultiple =真)]

パブリッククラスDEBUGINFO:System.Attribute
{
  プライベートint型bugNo。
  プライベート文字列の開発者。
  プライベート文字列lastReview。
  公共の文字列メッセージ。

  公共DEBUGINFO(int型BG、文字列devの、列D)
  {
      this.bugNo = BG;
      this.developer = devの。
      this.lastReview = D;
  }

  公共int型BugNo
  {
      ゲット
      {
          bugNoを返します。
      }
  }
  公共の文字列開発
  {
      ゲット
      {
          開発者を返します。
      }
  }
  公共の文字列LastReview
  {
      ゲット
      {
          lastReviewを返します。
      }
  }
  公共の文字列のメッセージ
  {
      ゲット
      {
          メッセージを返します。
      }
      セット
      {
          メッセージ=値;
      }
  }
}

カスタムプロパティを適用します。

この機能を適用するために、そのターゲットの直前にプロパティを配置することにより:

【DEBUGINFO(45、「ザラアリ "、" 2012年12月8日」、メッセージ= "戻り値の型の不一致")]
【DEBUGINFO(49、「Nuhaアリ "、" 2012年10月10日」、メッセージ= "未使用変数")]
クラス長方形
{
  //メンバー変数は、二重の長さを保護します。
  保護された二重の幅。
  公共長方形(ダブルリットル、二重ワット)
  {
      長さ=リットル;
      幅=ワット;
  }
  【DEBUGINFO(55、「ザラアリ」、「19/10/2012」、
  メッセージ= "戻り値の型の不一致")]
  公共ダブルGETAREA()
  {
      長さ*幅を返します。
  }
  【DEBUGINFO(56、「ザラアリ "、" 19/10/2012 ")]
  公共ボイドディスプレイ()
  {
      Console.WriteLineを( "長さ:{0}"、長さ);
      Console.WriteLineを( "幅:{0}"、幅);
      Console.WriteLineを( "エリア:{0}"、GETAREA());
  }
}

次の章では、この情報を取得するためにリフレクションクラスのオブジェクトを使用します。