>  기사  >  백엔드 개발  >  [c# 튜토리얼] C# 속성(Attribute)

[c# 튜토리얼] C# 속성(Attribute)

黄舟
黄舟원래의
2016-12-24 13:29:511144검색

C# 속성

속성은 런타임 레이블에서 프로그램의 다양한 요소(예: 클래스, 메서드, 구조, 열거형, 구성 요소 등)의 동작 정보를 전송하는 데 사용되는 선언적 메서드입니다. 속성을 사용하여 프로그램에 선언적 정보를 추가할 수 있습니다. 선언적 태그는 해당 태그가 적용되는 요소 앞에 있는 대괄호([ ])로 설명됩니다.

속성은 컴파일러 지시문 및 주석, 설명, 메서드, 클래스 및 기타 정보와 같은 메타데이터를 추가하는 데 사용됩니다. .Net 프레임워크는 사전 정의된 속성과 사용자 정의 속성이라는 두 가지 유형의 속성을 제공합니다.

속성을 지정(Attribute)

속성(Attribute)을 지정하는 구문은 다음과 같습니다.

[attribute(positional_parameters, name_parameter = value, ...)]
element

속성(Attribute)의 이름과 값 대괄호 안에 지정되며 적용되는 요소 앞에 배치됩니다. positional_parameters는 필수 정보를 지정하고 name_parameter는 선택적 정보를 지정합니다.

사전 정의된 속성(Attribute)

.Net 프레임워크는 세 가지 사전 정의된 속성을 제공합니다:

AttributeUsage

조건부

사용되지 않음

AttributeUsage

사전 정의된 속성 AttributeUsage는 사용자 정의 속성 클래스를 사용하는 방법을 설명합니다. 기능을 적용할 수 있는 항목 유형을 지정합니다.

이 속성을 지정하는 구문은 다음과 같습니다.

[AttributeUsage(
   validon,
   AllowMultiple=allowmultiple,
   Inherited=inherited
)]

위치:

validon 매개변수는 속성이 배치될 수 있는 언어 요소를 지정합니다. 열거자 AttributeTargets 값의 조합입니다. 기본값은 AttributeTargets.All입니다.

allowmultiple 매개변수(선택 사항)는 기능의 AllowMultiple 속성에 대한 부울 값을 제공합니다. true인 경우 속성은 다목적입니다. 기본값은 false(일회용)입니다.

상속 매개변수(선택 사항)는 이 기능의 Inherited 속성에 대한 부울 값을 제공합니다. true인 경우 이 특성은 파생 클래스에서 상속될 수 있습니다. 기본값은 false(상속되지 않음)입니다.

예:

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Feild |
AttributeTargets.Method |
AttributeTargets.Property, 
AllowMultiple = true)]

조건부

이 사전 정의된 속성은 실행이 최상위 전처리기 식별자에 따라 달라지는 조건부 메서드를 표시합니다.

디버그 또는 추적과 같이 지정된 값에 따라 메서드 호출의 조건부 컴파일이 발생합니다. 예를 들어, 코드를 디버깅할 때 변수 값을 표시합니다.

이 기능을 지정하는 구문은 다음과 같습니다.

[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
)]

위치:

매개변수 메시지는 프로젝트가 더 이상 사용되지 않는 이유와 그 내용을 설명하는 문자열입니다. 대신 사용합니다.

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 프레임워크를 사용하면 런타임 시 검색할 수 있는 선언적 정보를 저장하는 사용자 정의 속성을 생성할 수 있습니다. 이 정보는 설계 기준 및 애플리케이션 요구 사항에 따라 모든 대상 요소와 연관될 수 있습니다.

创建并使用自定义特性包含四个步骤:

声明自定义特性

构建自定义特性

在目标程序元素上应用自定义特性

通过反射访问特性

最后一个步骤包含编写一个简单的程序来读取元数据以便查找各种符号。元数据是用于描述其他数据的数据和信息。该程序应使用反射来在运行时访问特性。我们将在下一章详细讨论这点。

声明自定义特性

一个新的自定义特性应派生自 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으로 문의하세요.