C#之Attribute(特性)

时间:2023-03-10 05:41:37
C#之Attribute(特性)

本文主要复习下基础知识:

1.C#系统自带的特性:

建立一个控制台项目取名为AttributeTest:

C#之Attribute(特性)

我们添加了一个系统自带的Attribute叫Condition,这个特性表示在程序的DEBUG状态下才可以运行方法,我们在DEBUG下运行可以正常输出:

C#之Attribute(特性)

然后我们改为Release模式不会看到结果:

C#之Attribute(特性)

我们也可以写一个预处理指令在Release模式下也可以实现DEBUG的效果:

C#之Attribute(特性)

下面再来试下第二个系统自带的特性Obsolete,用来标识方法还能不能用的特性,如果当一个方法加了Obsolete特性且指定了错误信息的显示那么在调试生成的时候就不能通过编译:

C#之Attribute(特性)

2.自定义Attribute

C#之Attribute(特性)

3.通过反射来获取到2自定义的特性里面的信息:

C#之Attribute(特性)

C#之Attribute(特性)

C#之Attribute(特性)
C#之Attribute(特性)

最后总结一下特性的调用原理其实就是对特性类的一个实例化:

Attribute 实例化的语法是相当怪异的,主要体现在以下三点:   

1. 不使用new 操作符来产生实例,而是使用在方括号里调用构造函数来产生实例。   

2. 方括号必需紧挨着放置在被附着目标的前面。   

3. 因为方括号里空间有限,不能像使用new 那样先构造对象,然后再给对象的属性(Property)赋值。   因此,对Attribute 实例的属性赋值也在构造函数的圆括号里。   

并且,Attribute 实例化时尤其要注意的是:   

1. 构造函数的参数是一定要写。有几个就得写几个,因为你不写的话实例就无法构造出来。   

2. 构造函数参数的顺序不能错。调用任何函数都不能改变参数的顺序,除非它有相应的重载(Overload)。因为这个顺序是固定的,有些书里称其为“定位参数”(意即“个数和位置固定的参数”)。   

3. 对Attribute 实例的属性的赋值可有可无。反正它会有一个默认值,并且属性赋值的顺序不受限制。有些书里称属性赋值的参数为“具名参数”。