C# 特性(Attribute)(一)

转载 2007年09月18日 14:00:00
 特性(Attributes)是一种崭新的声明性信息。我们不仅可以通过特性来定义设计层面的信息(例如help file, URL for documentation)以及运行时(run-time)信息(例如使XMLclass相联系),而且我们还可以利用特性建立自描述(self- describing)组件。在这篇教程中,我们将会看到如何建立和添加特性到各种程序实体以及如何在运行时环境中获取特性信息。
   
定义
   
正如MSDN中所描述的那样-----  
   “
特性是被指定给某一声明的一则附加的声明性信息。”  
  
使用预定义(Pre-defined)特性  
  
C#中,有一个小的预定义特性集合。在学习如何建立我们自己的定制特性(custom attributes)之前,我们先来看看在我们的代码中如何使用预定义特性。  
  using System;
  public class AnyClass
  {
   [Obsolete("Don't use Old method, use New method", true)]
   static void Old( ) { }  
   static void New( ) { }  
   public static void Main( )
   {
   Old( );
   }
  }
  
我们先来看一下上面这个例子,在这个例子中我们使用了Obsolete特性,它标记了一个不应该再被使用的程序实体。第一个参数是一个字符串,它解释了为什么该实体是过时的以及应该用什么实体来代替它。实际上,你可以在这里写任何文本。第二个参数告诉编译器应该把使用这个过时的程序实体当作 一种错误。它的默认值是false,也就是说编译器对此会产生一个警告。  
  
当我们尝试编译上面这段程序的时候,我们将会得到一个错误:  
  AnyClass.Old()' is obsolete: 'Don't use Old method, use New method'    
  
开发定制特性(custom attributes 
  
现在让我们来看看如何开发我们自己的特性。 
  
首先我们要从System.Attribute派生出我们自己的特性类(一个从System.Attribute抽象类继承而来的类,不管是直接还是间接继承,都会成为一个特性类。特性类的声明定义了一种可以被放置在声明之上新的特性)。  
  using System;
  public class HelpAttribute : Attribute
  {
  }
  
不管你是否相信,我们已经建立了一个定制特性,现在我们可以用它来装饰现有的类就好像上面我们使用Obsolete attribute一样。  
  [Help()]
  public class AnyClass
  {
  }
  
注意:对一个特性类名使用Attribute后缀是一个惯例。然而,当我们把特性添加到一个程序实体,是否包括Attribute后缀是我们 的自由。编译器会首先在System.Attribute的派生类中查找被添加的特性类。如果没有找到,那么编译器会添加Attribute后缀继续查 找。  
  
到目前为止,这个特性还没有起到什么作用。下面我们来添加些东西给它使它更有用些。  
  using System;
  public class HelpAttribute : Attribute
  {
   public HelpAttribute(String Descrition_in)
   {
   this.description = Description_in;
   }
   protected String description;
   public String Description
   {
   get
   {
   return this.description;  
   }
   }
  }
  [Help("this is a do-nothing class")]
  public class AnyClass
  {
  }
  
在上面的例子中,我们给HelpAttribute特性类添加了一个属性并且在后续的部分中我们会在运行时环境中查寻它。
    
定义或控制特性的使用  

 

相关文章推荐

[C#]STAThread 初学习

转自http://blog.sina.com.cn/s/blog_4493d3b50100u6vi.html [STAThread]--Single-Thread Apartment 在C#中用在...

[STAThread]——c#

每个Thread都有一个关于ApartmentState的属性,可以把它设置为:STA或者MTA,或者UNKNOWN。     当你想指定工程的启动窗口的时候,你需要在该窗口类中申明一个Ma...

DataContractAttribute 类

指定该类型要定义或实现一个数据协定,并可由序列化程序(如 DataContractSerializer)进行序列化。 若要使其类型可序列化,类型作者必须为其类型定义数据协定。 继...
  • sgear
  • sgear
  • 2013年08月16日 01:09
  • 3598

WCF DataContract and DataMember

这篇来谈一下WCF中重要的两个成员,WCF DataContract and DataMember,如果我们想在客户端调用服务,就需要标注我们的对象或者对象中的属性为契约对象或者契约成员,这样的话,W...

C#中[STAThread]的作用和c#入门的问题

C#的关键字 [STAThread]即 single-threaded apartment 一: 每个Thread都有一个关于ApartmentState的属性,可以把它设置为:STA或者MTA,...

.NET中STAThread和MTAThread

1 COM中的公寓 本文讨论进程内COM组件。以一个示例直观演示STAThread和MTAThread的作用和区别。 1.1 基本规则 公寓是COM组件的运行环境,日常生活中公寓是用来住人的,C...

C#-Attribute特性

本篇http://kb.cnblogs.com/page/87531/ Attribute与Property 的翻译区别   Attribute 一般译作“特性”,Property 仍然译为“...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 特性(Attribute)(一)
举报原因:
原因补充:

(最多只允许输入30个字)