DIY.NETORM架構——技術儲備(1)Attribute

來源:互聯網
上載者:User

標籤: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階段我們就學過,那時我以為是一個東西……

        這個例子既是一個技術的儲備也告訴我自己,不要妄想一個東西一開始就弄的明明白白,知識是學習和積累出來的,不僅僅是學出來的!


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.