標籤:style blog http 使用 os io 檔案 資料
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階段我們就學過,那時我以為是一個東西……
這個例子既是一個技術的儲備也告訴我自己,不要妄想一個東西一開始就弄的明明白白,知識是學習和積累出來的,不僅僅是學出來的!