免费男女视频_国产系列 视频二区_羞羞视频免费入口网站_久国久产久精永久网页_国产免费观看av_一区二区三区日韩在线观看

浅析C#中的Attribute

最近用到了,所以靜下心來找些資料看了一下,終于把這東西搞清楚了。

一.什么是Attribute

先看下面的三段代碼:

1.自定義Attribute類:VersionAttribute

    [AttributeUsage(AttributeTargets.Class)]
    public class VersionAttribute : Attribute
    {
        public string Name { get; set; }
        public string Date { get; set; }
        public string Describtion { get; set; }
    }

2.使用自定義Attribute的Class:

    [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
    public class MyCode
    {
        //...
    }

3.上面這個Class中的Attribute一般會被如何使用呢?

    class Program
    {
        static void Main(string[] args)
        {
            var info = typeof(MyCode);
            var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));
            Console.WriteLine(classAttribute.Name);
            Console.WriteLine(classAttribute.Date);
            Console.WriteLine(classAttribute.Describtion);
        }
    }

示例完畢!上面三段代碼相信已經說明了Attribute大概是一個什么東西和怎么去用。

二.深入討論Attribute

1.Attribute的概念定義

關于Attribute概念的定義,我直接引用《你必須知道的.NET之特性和屬性》中的一段來說明:

MADN的定義為:公共語言運行時允許添加類似關鍵字的描述聲明,叫做attributes, 它對程序中的元素進行標注,如類型、字段、方法和屬性等。Attributes和Microsoft .NET Framework文件的元數據(metadata)保存在一起,可以用來向運行時描述你的代碼,或者在程序運行的時候影響應用程序的行為。

我們簡單的總結為:定制特性attribute,本質上是一個類,其為目標元素提供關聯附加信息,并在運行期以反射的方式來獲取附加信息。

噢,原來Attribute的目的是為元素提供關聯附加信息。其中,上面第一段代碼中“[AttributeUsage(AttributeTargets.Class)] ”說明了Attribute提供附加信息的元素是Class,所以如果上面第二段的代碼改為:

public class MyCode
{
    [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  public void Test() { }
}

 

會出現編譯錯誤。

2.Attribute作為編譯指令

Attribute類是在編譯的時候被實例化的,而不是像通常的類那樣在運行時候才實例化。所以在第三段代碼中,你可以在沒有實例化MyCode對象的情況下取到MyCode的Attribute信息。由于Attribute類是在編譯的時候被實例化的,所以你還可以用外部工具維護這些Attribute信息。

3.Attribute與Property

從中文來說,Attribute和Property的中文都叫“屬性”,很容易讓人混淆。現在的文章,Attribute一般翻譯為”特性”,而Property稱為“屬性”。

或許你會問,我用靜態的Property/Field一樣可以做到在不實例化的時候拿到一些信息,如果這樣的話,Attribute又有什么存在意義呢?

1.Property:

Property可以說是一個面向對象的概念,提供了對私有字段的訪問封裝,在C#中以get和set訪問器方法實現對可讀可寫屬性的操作,提供了安全和靈活的數據訪問封裝。比如:

    public class Robot
    {
        private string name = "";   //字段:Field
        public string Name          //屬性:Property,對Field進行封裝。
          {
            get { return name; }
            set { name = value; }
        }
    }

2.Attribute:

Attribute的目標是:為元素提供附加信息。它的作用更類似于注釋。

可以說,Property/Field和Attribute是兩個完全不同的概念,雖然他們有些時候能做一樣的事,但請記住,他們是從本質上就不同的兩個東西。

三.實現自己的Attribute時需要注意的一些問題

1.自定義的Attribute必須直接或者間接繼承System.Attribute。

2.這里有一個約定:所有自定義的特性名稱都應該有個Attribute后綴。因為當你的Attribute施加到一個程序的元素上的時候,編譯器先查找你的Attribute的定義,如果沒有找到,那么它就會查找“Attribute名稱"+Attribute的定義。如果都沒有找到,那么編譯器就報錯。這就是為什么我可以再上面第一段代碼中,定義一個VersionAttribute,但在第二段代碼中,我使用卻是Version這個Attribute。:>

下面是一些開發自定義Attribute時,可能需要用到的資料:

【1】Attribute可以關聯的元素包括:

程序集(assembly)、模塊(module)、類型(type)、屬性(property)、事件(event)、字段(field)、方法(method)、參數(param)、返回值(return)。例如:

    [assembly: Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
    public class MyCode
    {
        //......
    }

用指定的前綴來表示特性所應用的目標元素,建議這樣來處理,因為顯式處理可以消除可能帶來的二義性。

【2】AttributeTargets目標包括:

標記 說明
All 可以對任何應用程序元素應用屬性。
Assembly 可以對程序集應用屬性。
Class 可以對類應用屬性。
Constructor 可以對構造函數應用屬性。
Delegate 可以對委托應用屬性。
Enum 可以對枚舉應用屬性。
Event 可以對事件應用屬性。
Field 可以對字段應用屬性。
GenericParameter 可以對泛型參數應用屬性。
Interface 可以對接口應用屬性。
Method 可以對方法應用屬性。
Module Module 指的是可移植的可執行文件(.dll 或 .exe),而非 Visual Basic 標準模塊。
Parameter 可以對參數應用屬性。
Property 可以對屬性 (Property) 應用屬性 (Attribute)。
ReturnValue 可以對返回值應用屬性。
Struct 可以對結構應用屬性,即值類型。

【3】AttributeUsageAttribute中的3個屬性(Property)說明:

屬性名 說明
ValidOn 該定位參數指定可在其上放置所指示的屬性 (Attribute) 的程序元素。AttributeTargets 枚舉數中列出了可在其上放置屬性 (Attribute) 的所有可能元素的集合。可通過按位“或”運算組合多個 AttributeTargets 值,以獲取所需的有效程序元素組合。
AllowMultiple 該命名參數指定能否為給定的程序元素多次指定所指示的屬性。
Inherited 該命名參數指定所指示的屬性能否由派生類和重寫成員繼承。

 

主站蜘蛛池模板: 国产青草视频在线观看视频 | 欧美成人一区二区三区 | 污黄视频在线播放 | 黄色av网站免费 | 蜜桃视频在线观看视频 | 国产精品久久久久久久亚洲按摩 | 男男啪羞羞视频网站 | 91短视频在线播放 | 一本色道久久综合亚洲精品图片 | 午夜小电影 | 国产精品爱久久久久久久 | 国产精品视频一区二区三区综合 | 一区二区免费看 | h视频在线免费看 | 高清中文字幕在线 | 亚洲网站一区 | 色999国产 | 狠狠干五月天 | fc2国产成人免费视频 | 久久久久久中文字幕 | 好吊色欧美一区二区三区四区 | 国产精品成人av片免费看最爱 | 202z中文字幕第一页 | 亚洲骚妻| 亚洲一区二区观看播放 | 撅高 自己扒开 调教 | 国产精品区一区二区三区 | 美女福利视频国产 | 97久久精品一区二区三区观看 | 日本不卡视频在线观看 | 国产二区三区在线播放 | av在线收看 | 一本色道久久综合狠狠躁篇适合什么人看 | 亚洲精品7777 | 蜜桃传免费看片www 一本色道精品久久一区二区三区 | 日日摸夜夜添夜夜添牛牛 | 狠狠色噜噜狠狠狠米奇9999 | 久久影院午夜 | 成年免费大片黄在线观看岛国 | 国产亚洲高清在线精品不卡 | 免费国产网站 |