C# - 属性
属性 是一个声明性标记,用于向运行时传达有关程序中各种元素(如类、方法、结构、枚举器、程序集等)的行为的信息。您可以使用属性将声明性信息添加到程序中。声明性标签由放置在其所用元素上方的方括号 ([ ]) 来描述。
属性用于向程序添加元数据,例如编译器指令和其他信息,例如注释、描述、方法和类。 .Net Framework 提供了两种类型的属性:预定义的 属性和自定义构建 属性。
指定属性
指定属性的语法如下 -
[attribute(positional_parameters, name_parameter = value, ...)] element
属性的名称及其值在方括号内指定,位于应用属性的元素之前。位置参数指定必要信息,名称参数指定可选信息。
预定义属性
.Net Framework 提供了三个预定义的属性 -
- 属性使用
- 有条件的
- 已过时
属性使用
预定义属性 AttributeUsage 描述如何使用自定义属性类。它指定了可以应用该属性的项目类型。
指定此属性的语法如下 -
[AttributeUsage ( validon, AllowMultiple = allowmultiple, Inherited = inherited )]
哪里,
-
参数validon 指定可以放置属性的语言元素。它是枚举器 AttributeTargets 的值的组合 .默认值为 AttributeTargets.All .
-
参数allowmultiple (可选)为 AllowMultiple 提供值 该属性的属性,一个布尔值。如果这是真的,则该属性是多用途的。默认为 false(一次性使用)。
-
继承的参数(可选)为 Inherited 提供值 该属性的属性,一个布尔值。如果为真,则该属性由派生类继承。默认值为false(不继承)。
例如,
[AttributeUsage( AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
有条件的
该预定义属性标记了一个条件方法,其执行取决于指定的预处理标识符。
它会导致方法调用的条件编译,具体取决于 Debug 等指定值 或 跟踪 .例如,它在调试代码时显示变量的值。
指定此属性的语法如下 -
[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 , 是一个布尔值。如果它的值为真,编译器应该将该项目的使用视为错误。默认值为 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 框架允许创建可用于存储声明性信息并可以在运行时检索的自定义属性。根据设计标准和应用需求,此信息可以与任何目标元素相关。
创建和使用自定义属性涉及四个步骤 -
- 声明自定义属性
- 构造自定义属性
- 在目标程序元素上应用自定义属性
- 通过反射访问属性
最后一步涉及编写一个简单的程序来读取元数据以查找各种符号。元数据是关于数据的数据或用于描述其他数据的信息。该程序应使用反射在运行时访问属性。这个我们将在下一章讨论。
声明自定义属性
应该从 System.Attribute 派生一个新的自定义属性 班级。例如,
//a custom attribute BugFix to be assigned to a class and its members [AttributeUsage( AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
在前面的代码中,我们声明了一个名为 DeBugInfo 的自定义属性 .
构造自定义属性
让我们构造一个名为 DeBugInfo 的自定义属性 ,它存储了调试任何程序获得的信息。让它存储以下信息 -
- 错误代码
- 发现错误的开发者姓名
- 最后审查代码的日期
- 存储开发者备注的字符串消息
调试信息 类具有用于存储前三个信息的三个私有属性和一个用于存储消息的公共属性。因此,错误编号、开发人员姓名和审查日期是 DeBugInfo 类的位置参数,而消息是可选或命名参数。
每个属性必须至少有一个构造函数。位置参数应通过构造函数传递。以下代码显示了 DeBugInfo 类-
//a custom attribute BugFix to be assigned to a class and its members [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 { //member variables 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语言