ホームページ バックエンド開発 C#.Net チュートリアル 【c#チュートリアル】C#の属性(Attribute)

【c#チュートリアル】C#の属性(Attribute)

Dec 24, 2016 pm 01:29 PM
c#

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)!


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# を使用した Active Directory C# を使用した Active Directory Sep 03, 2024 pm 03:33 PM

C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# の乱数ジェネレーター C# の乱数ジェネレーター Sep 03, 2024 pm 03:34 PM

C# の乱数ジェネレーターのガイド。ここでは、乱数ジェネレーターの仕組み、擬似乱数の概念、安全な数値について説明します。

C# シリアル化 C# シリアル化 Sep 03, 2024 pm 03:30 PM

C# シリアル化のガイド。ここでは、C# シリアル化オブジェクトの導入、手順、作業、例についてそれぞれ説明します。

C# データ グリッド ビュー C# データ グリッド ビュー Sep 03, 2024 pm 03:32 PM

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

C# のパターン C# のパターン Sep 03, 2024 pm 03:33 PM

C# のパターンのガイド。ここでは、C# のパターンの概要と上位 3 種類について、その例とコード実装とともに説明します。

C# の素数 C# の素数 Sep 03, 2024 pm 03:35 PM

C# の素数ガイド。ここでは、C# における素数の導入と例を、コードの実装とともに説明します。

C# の階乗 C# の階乗 Sep 03, 2024 pm 03:34 PM

C# の Factorial のガイド。ここでは、C# での階乗の概要について、さまざまな例とコード実装とともに説明します。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

See all articles