|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
效率会有不少的变化。而实际上net网页编程是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。系列文章索引:《口语C#》
起首要说的是,大概一些刚打仗C#的伴侣经常简单把属性(Property)跟特征(Attribute)弄搅浑,实在这是两种分歧的工具。属性就是面向对象头脑里所说的封装在类内里的数据字段,其情势为:- 3:publicstringName{get;set;}
复制代码- 5:publicintGender{get;set;}
复制代码 在HumanBase这个类里呈现的字段都叫属性(Property),而特征(Attribute)又是如何的呢?- 4:publicstringName{get;set;}
复制代码 复杂地讲,我们在HumanBase类声明的上一行加了一个[Serializable],这就是特征(Attribute),它暗示HumanBase是能够被序列化的,这关于收集传输是很主要的,不外你不必忧虑怎样往了解它,怎样了解就是我们上面要切磋的。
C#的特征能够使用于各类范例和成员。后面的例子将特征用在类上就能够被称之为“类特征”,同理,假如是加在办法声明后面的就叫办法特征。不管它们被用在那里,不管它们之间有甚么区分,特征的最次要目标就是自形貌。而且由于特征是能够由本人定制的,而不单单范围于.NET供应的那几个现成的,因而给C#程序开辟带来了相称年夜的天真性和便当。
我们仍是借用生存中的例子来先容C#的特征机制吧。
假定有一天你往坐飞机,你就必需提早往机场登机处换登机牌。登机牌就是一张纸,下面写着哪趟航班、由那里飞往那里和你的名字、坐位号等等信息,实在,这就是特征。它不必要你心理上包括这些属性(人类呈现那会儿还没飞机呢),就像下面的HumanBase类没有IsSerializable如许的属性,特征只必要在类或办法必要的时分加上往就好了,就像你不老是在天上飞一样。
当我们想晓得HumanBase是否是可序列化的,能够经由过程:拿到了登机牌,就意味着你能够正当地登机腾飞了。但此时你还不晓得你要坐的飞机停在那里,不必忧虑,地勤职员会开车送你已往,可是他怎样晓得你是哪趟航班的呢?明显仍是经由过程你手中的登机牌。以是,特征最年夜的特性就是自形貌。
既然是起到形貌的感化,那目标就是在于限制。就比如地勤不会把你任意拉到一架飞机跟前就扔上往了事,由于标签上的申明信息就是起到限制的感化,限制了目标地、搭客和航班,任何不对都被视为非常。假如后面的HumanBase不加上Serializable特征就不克不及在收集上传输。
我们在顺带来先容一下办法特征,先给HumanProperty加上一个Run办法:- 3:publicstringName{get;set;}0
复制代码- 4:publicstringName{get;set;}
复制代码- 3:publicstringName{get;set;}5
复制代码- 3:publicstringName{get;set;}6
复制代码- 3:publicstringName{get;set;}7
复制代码- 3:publicstringName{get;set;}8
复制代码- 3:publicstringName{get;set;}9
复制代码- 4:publicintAge{get;set;}0
复制代码 只需是个四肢健全、身材安康的人就能够跑步,那这么说,跑步就是有条件前提的,最少是四肢健全,身材安康。因而可知,残疾人和老年人假如跑步就会出成绩。假定一个HumanBase的对象代表的是一名耄耋白叟,假如让他当刘翔的陪练,那就间接光彩了。怎样制止如许的情形呢,我们能够在Run办法中加一段逻辑代码,先判别Age巨细,假如小于2或年夜于60间接抛非常,可是2-60岁之间也得用Switch来分岁数阶段地判别speed参数是不是符合,那末逻辑就相称痴肥。简而言之,怎样用特征暗示一个办法不克不及被利用呢?OK,herewego:- 4:publicintAge{get;set;}1
复制代码- 4:publicintAge{get;set;}2
复制代码- 4:publicintAge{get;set;}4
复制代码- 4:publicintAge{get;set;}5
复制代码 下面大抵先容了一下特征的利用与感化,接上去我们要向人人展现的是怎样经由过程自界说特征来进步程序的天真性,假如特征机制仅仅能利用.NET供应的那几种特征,不就太不外瘾了么。
起首,特征也是类。分歧于别的类的是,特征都必需承继自System.Attribute类,不然编译器怎样晓得谁是特征谁是一般类呢。当编译器检测到一个类是特征的时分,它会辨认出个中的信息并寄存在元数据傍边,仅此罢了,编译器其实不体贴特征说了些甚么,特征也不会对编译器起就任何感化,正如航空公司其实不体贴每一个箱子要往那里,只要箱子的仆人和搬运工才会往体贴这些细节。假定我们如今就是航空公司的办理职员,必要计划出后面提到的登机牌,那末很复杂,我们先看看最次要的信息有哪些:- 4:publicintAge{get;set;}6
复制代码- 4:publicintAge{get;set;}8
复制代码- 4:publicintAge{get;set;}9
复制代码- 5:publicintGender{get;set;}0
复制代码- 5:publicintGender{get;set;}1
复制代码- 5:publicintGender{get;set;}2
复制代码- 5:publicintGender{get;set;}3
复制代码- 5:publicintGender{get;set;}4
复制代码 我们复杂枚举这些属性作为航空公司登机牌上的信息,用法和后面的一样,贴到HumanBase上就好了,申明这人具有登机资历。这里要复杂提一下,你大概已注重到了,在利用BoardingCheckAttribute的时分已把Attribute省略失落了,不必忧虑,如许做是对的,由于编译器默许会本人加上然后查找这个属性类的。哦,等一下,我俄然想起来他该登哪架飞机呢?明显,在这类需求下,我们的特征还没有起到应有的感化,我们还的做点儿事情,不然搭客面临一张空缺的机票必定会很渺茫。
因而,我们必需给这个特征加上机关函数,由于它不单单暗示登机的资历,还必需包括一些需要的信息才行:- 5:publicintGender{get;set;}5
复制代码- 5:publicintGender{get;set;}7
复制代码- 5:publicintGender{get;set;}8
复制代码- 5:publicintGender{get;set;}9
复制代码- 5:publicintGender{get;set;}4
复制代码 OK,我们的搭客就能够拿到一张正式的登机牌登机了,haveagoodflight!- 3:publicstringName{get;set;}7
复制代码 来自:特征
我实在想不明白net网页编程的机制,为什么非要那么蛋疼,在同一个平台下重复编译。 |
|