菜鸟教程C#高级教程

C#特性(Attribute)

.Net框架提供了三种预定义特性:attributeUsageConditional、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特性所包含的条件,他才会响应你定义的条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值