特性(attribute)是被指定给某一声明的一则附加的声明性信息。
在C#中,有一个小的预界说特性调集。在学习如何成立我们本身的定制特性(custom attributes)之前,我们先来看看在我们的代码中如何使用预界说特性。
1 using System;
2 public class AnyClass
3 {
4 [Obsolete("Don‘t use Old method, use New method", true)]
5 static void Old( ) { }
6 static void New( ) { }
7 public static void Main( )
8 {
9 Old( );
10 }
11 }
我们先来看一下上面这个例子,在这个例子中我们使用了Obsolete特性,它符号了一个不应该再被使用的措施实体。第一个参数是一个字符串,它解释了为什么该实体是过时的以及应该用什么实体来取代它。实际上,你可以在这里写任何文本。第二个参数报告编译器应该把使用这个过时的措施实体看成一种错误。它的默认值是false,也就是说编译器对此会孕育产生一个警告。
当我们测验考试编译上面这段措施的时候,我们将会得到一个错误:
AnyClass.Old()‘ is obsolete: ‘Don‘t use Old method, use New method‘
二、特性是什么
定制特性其实是一个类型的实例,为了切合“大众语言规范”CLS的要求,定制特性类必需直接或间接从大众抽象类System.Atrribute派生。检察文档发明StructLayoutAttribute,MarshalAsAttribute,DllImportAttribute,InAttribute和OutAttribute,这些类都是从System.Attribute派生。所有切合CLS规范的特性类都必定从这个类派生。
三、界说本身的特性
开发定制特性(custom attributes)
此刻让我们来看看如何开发我们本身的特性。
首先我们要从System.Attribute派生出我们本身的特性类(一个从System.Attribute抽象类担任而来的类,不管是直接还是间接担任,城市成为一个特性类。特性类的声明界说了一种可以被安排在声明之上新的特性)。
1 using System;
2 public class HelpAttribute : Attribute
3 {
4 }
不管你是否相信,我们已经成立了一个定制特性,此刻我们可以用它来装饰现有的类就仿佛上面我们使用Obsolete attribute一样。
1 [Help()]
2 public class AnyClass
3 {
4 }
注意:对一个特性类名使用Attribute后缀是一个惯例。然而,当我们把特性添加到一个措施实体,是否包孕 Attribute后缀是我们的*。编译器会首先在System.Attribute的派生类中查找被添加的特性类。如果没有找到,那么编译器会添加 Attribute后缀继续查找。
到目前为止,这个特性还没有起到什么感化。下面我们来添加些对象给它使它更有用些。
1 using System;
2 public class HelpAttribute : Attribute
3 {
4 public HelpAttribute(String Descrition_in)
5 {
6 this.description = Description_in;
7 }
8 protected String description;
9 public String Description
10 {
11 get
12 {
13 return this.description;
14 }
15 }
16 }
17 [Help("this is a do-nothing class")]
18 public class AnyClass
19 {
20 }
在上面的例子中,我们给HelpAttribute特性类添加了一个属性并且在后续的部分中我们会在运行时环境中查寻它。
四、限制特性