C#特性(Attribute)
.Net框架提供了三种预定义特性:attributeUsage、Conditional、obsolete
预定义特性AttributeUsage:预定义特性attributeusage描述了如何使用一个自定义特性类,它规定了特性可应用到的项目的类型。
[AttributeUsage(
validon,
AllowMultiple=allowmultiple,
Inherited=inherited)}
Conditional
这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。它会引起方法调用的条件编译,取决于指定的值,比如Debug或Trace.例如,当调试代码时显示变量的值。
规定该特性的语法如下:
[Conditional( conditionalSymbol )] 例如: [Conditional("DEBUG")]
Obsolete
这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。
[Obsolete(
message
)]
[Obsolete(
message,
iserror
)]
参数message,是一个字符串,描述项目为什么过时的原因以及该替代是用什么。
参数iserror,是一个布尔值。如果该值为true,编译器应把该项目的使用当做一个错误,默认值的false(编译器生成一个警告)。
创建自定义特性(Attribute)
.Net框架允许创建自定义特性,用于存储声明性信息,且可在运行时被检索,该信息根据设计标准和程序需要,可与任何目标元素相关。
创建并使用自定义特性包含四个步骤:
声明自定义特性。构建自定义特性、在目标程序元素上应用自定义特性、通过反射访问自定义特性。
声明自定义特性:
一个新的自定义特性应派生自System.Attribute类。例如:
// 一个自定义特性 BugFix 被赋给类及其成员
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute
构建自定义
// 一个自定义特性 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; } } }
C#中利用Conditional定义条件方法
利用conditional属性,程序员可以定义条件方法。conditional属性通过测试条件编译符号来确定适用的条件。当运行到一个条件方法调用时,是否执行该调用,要根据出现该调用时是否已定义了此符号来确定。如果定义了此符号,则执行该调用;否则省略该调用(包括对调用的参数的计算)。使用Conditional是封闭#if和#endif内部方法的替代方法,它更整洁、更别致、减少了出错的机会。
条件方法要受到以下限制:
条件方法必须是类声明或结构声明中的方法。如果在接口声明中的方法指定Conditional属性,将出现编译时错误。
条件方法必须具有返回类型。
不能用override修饰符标记条件方法。但是可以用virtual修饰符标记条件方法。此类方法的重写方法隐含为有条件的方法,而且不能用Conditional属性显式标记。
条件方法不能是接口方法的实现。否则将发生编译时错误。
如果条件方法用在委托创建表达式中,也会发生编译时错误。
这里需要注意的是:如果创建一个没有定义任何条件的方法,那么默认只要调用就总是会执行此方法,如果你想通过条件判断来执行,那么该方法上必须至少包含一个conditional特性所包含的条件,他才会响应你定义的条件。