C# 속성
속성 은 런타임 시 프로그램의 다양한 요소(예: 클래스, 메서드, 구조, 열거형, 구성 요소 등)의 동작 정보를 전달하는 데 사용되는 선언적 태그입니다. 속성을 사용하여 프로그램에 선언적 정보를 추가할 수 있습니다. 선언적 태그는 해당 태그가 적용되는 요소 앞에 있는 대괄호([ ])로 설명됩니다.
속성은 컴파일러 지침 및 주석, 설명, 메서드, 클래스 및 기타 정보와 같은 메타데이터를 추가하는 데 사용됩니다. .Net 프레임워크는 사전 정의된기능과 맞춤기능이라는 두 가지 유형의 기능을 제공합니다.
속성 지정(Attribute)
속성(Attribute)을 지정하는 구문은 다음과 같습니다.
[attribute(positional_parameters, name_parameter = value, ...)] element
속성(Attribute)의 이름과 값은 대괄호 안에 지정되며 해당 속성이 적용되는 요소 앞에 배치됩니다. positional_parameters는 필수 정보를 지정하고 name_parameter는 선택적 정보를 지정합니다.
사전 정의된 속성(속성)
.Net 프레임워크는 세 가지 사전 정의된 속성을 제공합니다.
AttributeUsage
Conditional
Obsolete
AttributeUsage
사전 정의 속성AttributeUsage 설명 사용자 정의 사용 방법 속성 클래스. 기능을 적용할 수 있는 항목 유형을 지정합니다.
이 기능을 지정하는 구문은 다음과 같습니다.
[AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited )]
위치:
validon 매개변수는 기능이 배치될 수 있는 언어 요소를 지정합니다. 열거자 AttributeTargets 값의 조합입니다. 기본값은 AttributeTargets.All입니다.
매개변수 allowmultiple(선택 사항)는 기능의 AllowMultiple 속성에 부울 값을 제공합니다. true인 경우 속성은 다목적입니다. 기본값은 false(일회용)입니다.
Parameter inherited(선택 사항) 이 기능의 Inherited 속성에 부울 값을 제공합니다. true인 경우 이 특성은 파생 클래스에서 상속될 수 있습니다. 기본값은 false(상속되지 않음)입니다.
예:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | 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 )]
위치:
매개변수 message는 해당 항목이 더 이상 사용되지 않는 이유와 대신 사용할 항목을 설명하는 문자열입니다.
매개변수 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
사용자 정의 속성 생성(속성)
.Net 프레임워크를 사용하면 런타임 시 검색할 수 있는 선언적 정보를 저장하는 사용자 정의 속성을 생성할 수 있습니다. 이 정보는 설계 기준 및 애플리케이션 요구 사항에 따라 모든 대상 요소와 연관될 수 있습니다.
사용자 정의 속성 생성 및 사용은 4단계로 구성됩니다.
사용자 정의 속성 선언
사용자 정의 속성 구축
대상 프로그램 요소에 사용자 정의 속성 적용
리플렉션을 통해 속성 액세스
마지막 단계는 다양한 기호를 찾기 위해 메타데이터를 읽는 간단한 프로그램을 작성하는 것입니다. 메타데이터는 다른 데이터를 설명하는 데 사용되는 데이터 및 정보입니다. 프로그램은 런타임 시 속성에 액세스하기 위해 리플렉션을 사용해야 합니다. 이에 대해서는 다음 장에서 자세히 논의하겠습니다.
사용자 정의 속성 선언
새로운 사용자 정의 속성은 System.Attribute 클래스에서 파생되어야 합니다. 예:
// 一个自定义特性 BugFix 被赋给类及其成员 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
위 코드에서는 DeBugInfo라는 사용자 정의 속성을 선언했습니다.
사용자 정의 속성 구축
디버거에서 얻은 정보를 저장할 DeBugInfo라는 사용자 정의 속성을 구축해 보겠습니다. 여기에는 다음 정보가 저장됩니다.
버그의 코드 번호
버그를 식별한 개발자의 이름
코드가 마지막으로 검토된 날짜
버그를 저장하는 문자열 메시지 개발자 태그
우리의 DeBugInfo 클래스에는 처음 세 가지 정보를 저장하는 세 가지 개인 속성(속성)과 메시지를 저장하는 하나의 공용 속성(속성)이 있습니다. 따라서 버그 번호, 개발자 이름 및 검토 날짜는 DeBugInfo 클래스의 필수 위치 매개변수가 되고 메시지는 선택적인 명명된 매개변수가 됩니다.
각 기능에는 생성자가 하나 이상 있어야 합니다. 필수 위치 매개변수는 생성자를 통해 전달되어야 합니다. 다음 코드는 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()); } }
다음 장에서는 Reflection 클래스 개체를 사용하여 이 정보를 검색합니다.