1、他是什么 ?
首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述:
公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
其实特别简单:Attribute就是一种“附着物”,就像超市商品上贴的标签。这些附着物的作用是为它们的附着体追加上一些额外的信息(这些信息就保存在附着物的体内),在商品上就像他的标签,是否参与特价等信息。
2、简单实例
实现:商场有N种商品,在特价商品柜台只结账特价商品
类说明:
Commodity:商品类
Program:卖特价商品的前台
[ConditionalAttribute("special")]:特价标签
[ConditionalAttribute("normal")]:非特价标签
代码:
<span style="font-size:18px;">#define special // C#的宏定义必须出现在所有代码之前。当前我们只让special宏有效。(代表特价商品) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; // 注意:这是为了使用包含在此名称空间中的ConditionalAttribute特性 namespace AttributeSample { /// <summary> /// 商品类 /// </summary> class Commodity { //特价商品********************************************************************************* /// <summary> /// 卖蛋糕 /// </summary> [ConditionalAttribute("cake")] // Attribute名称的长记法 [ConditionalAttribute("special")] public static void sellCake() { Console.WriteLine("卖出的是蛋糕, 特性为:special(特价)."); } /// <summary> /// 卖饼干 /// </summary> [Conditional("cookies")] [Conditional("special")] public static void sellCookies() { Console.WriteLine("卖出的是饼干, 特性为:special(特价)."); } //普通商品********************************************************************************* /// <summary> /// 卖牛奶 /// </summary> [ConditionalAttribute("Milk")] [ConditionalAttribute("normal")] public static void sellMilk() { Console.WriteLine("卖出的是牛奶, 特性为:normal(普通)."); } /// <summary> /// 卖面包 /// </summary> [Conditional("Bread")] // Attribute名称的短记法 [Conditional("normal")] public static void sellBread() { Console.WriteLine("卖出的是面包, 特性为:normal(普通)."); } } class Program { static void Main(string[] args) { //商品的商品都可在前台扫描 Commodity.sellCake(); Commodity.sellCookies(); Commodity.sellMilk(); Commodity.sellBread(); } } } </span>
执行结果:
结果分析:
为什么四个方法只有两个执行了?大家再仔细观察,发现只有特性为special的方法被执行了,我们研究 ConditionalAttribute 发现,这个类的作用就是检测方法的特性,与提前定义好的特性相符的才会执行,否则不执行,大家别想得太深奥,实际就是一个拦截器,Attribute 这时候的作用就体现了出来,他的影响程序执行的,所以他并不是和注释一样被编译器屏蔽,但是又和普通的属性不一样,我们通过一个直接的英语翻译来看看他们在语义上的区别:
Attribute:认为…是; 把…归于; 把…品质归于某人; 认为某事[物]属于某人[物];
property:特性,属性; 财产,地产; [戏]道具; 所有权;
就好像我们定义一个房子,里面有客厅,卧室,餐厅,这是属于这个房子的一部分,是property,而房子分为阴面和阳面,我们将客厅和餐厅打上标签是阳面,卧室是阴面,这是Attribute,他们都是为了描述一事物,当我们写“class Commodity”这句代码时,实际系统给我们自动打上了一个Attribute:“class” !
总结:
当我们发现,有一个事物貌似和以前接触的事物很形似,怎么看怎么像一个东西,这时,我们的要做的就是暂时将他们归为一类,减少我们的知识结点,而随着我们学习的深入,我们发现他貌似有些不同,我们才恍然大悟,他们是那么不一样,这个时候才知道,发明两种东西是为了解决两个问题!就像Attribute和property在uml阶段我们就学过,那时我以为是一个东西……
这个例子既是一个技术的储备也告诉我自己,不要妄想一个东西一开始就弄的明明白白,知识是学习和积累出来的,不仅仅是学出来的!
DIY.NETORM框架——技术储备(1)Attribute