C#:+(特性)+AttitudeC#(类)前⾯或者(⽅法)前⾯(中括
号)定义
系列⽂章索引:《》
⾸先要说的是,可能⼀些刚接触C#的朋友常常容易把属性(Property)跟特性(Attribute)弄混淆,其实这是两种不同的东西。属性就是⾯向对象思想⾥所说的封装在类⾥⾯的数据字段,其形式为:
1:public class HumanBase
2: {
3:public string Name { get; set; }
4:public int Age { get; set; }
5:public int Gender { get; set; }
6: }
在HumanBase这个类⾥出现的字段都叫属性(Property),⽽特性(Attribute)⼜是怎样的呢?
1: [Serializable]
2:public class HumanBase
3: {
writeline方法属于类4:public string Name { get; set; }
5:public int Age { get; set; }
6:public int Gender { get; set; }
7: }
简单地讲,我们在HumanBase类声明的上⼀⾏加了⼀个[Serializable],这就是特性(Attribute),它表⽰HumanBase是可以被序列化的,这对于⽹络传输是很重要的,不过你不⽤担⼼如何去理解它,如何理解就是我们下⾯要探讨的。
C#的特性可以应⽤于各种类型和成员。前⾯的例⼦将特性⽤在类上就可以被称之为“类特性”,同理,如果是加在⽅法声明前⾯的就叫⽅法特性。⽆论它们被⽤在哪⾥,⽆论它们之间有什么区别,特性的
最主要⽬的就是⾃描述。并且因为特性是可以由⾃⼰定制的,⽽不仅仅局限于.NET提供的那⼏个现成的,因此给C#程序开发带来了相当⼤的灵活性和便利。
我们还是借⽤⽣活中的例⼦来介绍C#的特性机制吧。
假设有⼀天你去坐飞机,你就必须提前去机场登机处换登机牌。登机牌就是⼀张纸,上⾯写着哪趟航班、由哪⾥飞往哪⾥以及你的名字、座位号等等信息,其实,这就是特性。它不需要你⽣理上包含这些属性(⼈类出现那会⼉还没飞机呢),就像上⾯的HumanBase类没有IsSerializable这样的属性,特性只需要在类或⽅法需要的时候加上去就⾏了,就像你不总是在天上飞⼀样。
当我们想知道HumanBase是不是可序列化的,可以通过:
1:static void Main(string[] args)
2: {
3: Console.WriteLine(typeof(HumanBase).IsSerializable);
4:
5: Console.ReadLine();
6: }
拿到了登机牌,就意味着你可以合法地登机起飞了。但此时你还不知道你要坐的飞机停在哪⾥,不⽤担⼼,地勤⼈员会开车送你过去,但是他怎么知道你是哪趟航班的呢?显然还是通过你⼿中的登机牌。所以,特性最⼤的特点就是⾃描述。
既然是起到描述的作⽤,那⽬的就是在于限定。就好⽐地勤不会把你随便拉到⼀架飞机跟前就扔上去了事,因为标签上的说明信息就是起到限定的作⽤,限定了⽬的地、乘客和航班,任何差错都被视为异常。如果前⾯的HumanBase不加上Serializable特性就不能在⽹络上传输。
我们在顺带来介绍⼀下⽅法特性,先给HumanProperty加上⼀个Run⽅法:
1: [Obsolete("I'm so old, don't kill me!", true)]
2:public virtual void Run(int speed)
3: {
4:// Running is good for health.
5: }
上⾯⼤致介绍了⼀下特性的使⽤与作⽤,接下来我们要向⼤家展⽰的是如何通过⾃定义特性来提⾼程序的灵活性,如果特性机制仅仅能使⽤.NET提供的那⼏种特性,不就太不过瘾了么。
⾸先,特性也是类。不同于其它类的是,特性都必须继承⾃System.Attribute类,否则编译器如何知道谁是特性谁是普通类呢。当编译器检测到⼀个类是特性的时候,它会识别出其中的信息并存放在元数据当中,仅此⽽已,编译器并不关⼼特性说了些什么,特性也不会对编译器起到任何作⽤,正如航空公司并不关⼼每个箱⼦要去哪⾥,只有箱⼦的主⼈和搬运⼯才会去关⼼这些细节。假设我们现在就是航空公司的管理⼈员,需要设计出前⾯提到的登机牌,那么很简单,我们先看看最主要的信息有哪些:
单提⼀下,你可能已经注意到了,在使⽤BoardingCheckAttribute的时候已经把Attribute省略掉了,不⽤担⼼,这样做是对的,因为编译器默认会⾃⼰加上然后查这个属性类的。哦,等⼀下,我突然想起来他该登哪架飞机呢?显然,在这种需求下,我们的特性还没有起到应有的作⽤,我们还的做点⼉⼯作,否则乘客⾯对⼀张空⽩的机票⼀定会很迷茫。
于是,我们必须给这个特性加上构造函数,因为它不仅仅表⽰登机的资格,还必须包含⼀些必要的信息才⾏:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论