日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[你必须知道的.NET] 第三回:历史纠葛:特性和属性

發布時間:2023/12/10 asp.net 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [你必须知道的.NET] 第三回:历史纠葛:特性和属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文將介紹以下內容:

? 定制特性的基本概念和用法

? 屬性與特性的區別比較

? 反射的簡單介紹

1.?引言

attribute是.NET框架引入的有一技術亮點,因此我們有必要花點時間來了解本文的內容,走進一個發現attribute登堂入室的入口。因為.NET Framework中使用了大量的定制特性來完成代碼約定,[Serializable]、[Flags]、[DllImport]、[AttributeUsage]這些的構造,相信我們都見過吧,那么你是否了解其背后的技術。

提起特性,由于高級語言發展的歷史原因,不免讓人想起另一個耳熟能詳的名字:屬性。特性和屬性,往往給初學者或者從C++轉移到C#的人混淆的概念沖擊。那么,什么是屬性,什么是特性,二者的概念和區別,用法與示例,將在本文做以概括性的總結和比較,希望給你的理解帶來收獲。另外本文的主題以特性的介紹為主,屬性的論述重點突出在二者的比較上,關于屬性的更多論述將在另一篇主題中詳細討論,敬請關注。

2. 概念引入

2.1. 什么是特性?

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

我們簡單的總結為:定制特性attribute,本質上是一個類,其為目標元素提供關聯附加信息,并在運行期以反射的方式來獲取附加信息。具體的特性實現方法,在接下來的討論中繼續深入。

2.2. 什么是屬性?

?屬性是面向對象編程的基本概念,提供了對私有字段的訪問封裝,在C#中以get和set訪問器方法實現對可讀可寫屬性的操作,提供了安全和靈活的數據訪問封裝。關于屬性的概念,不是本文的重點,而且相信大部分的技術人員應該對屬性有清晰的概念。以下是簡單的屬性示例:

?

????public?class?MyProperty
????{
????????
//定義字段
????????private?string?_name;
????????
private?int?_age;

????????
//定義屬性,實現對_name字段的封裝
????????public?string?Name
????????{
????????????
get?{?return?(_name?==?null)???string.Empty?:?_name;?}
????????????
set?{?_name?=?value;?}
????????}

????????
//定義屬性,實現對_age字段的封裝
????????
//加入對字段的范圍控制
????????public?int?Age
????????{
????????????
get?{?return?_age;?}
????????????
set
????????????{
????????????????
if?((value?>?0)?&&?(value?<?150))
????????????????{
????????????????????_age?
=?value;
????????????????}
????????????????
else
????????????????{
????????????????????
throw?new?Exception("Not?a?real?age");
????????????????}
????????????}
????????}
????}

????
public?class?MyTest
????{
????????
public?static?void?Main(string[]?args)
????????{
????????????MyProperty?myProperty?
=?new?MyProperty();
????????????
//觸發set訪問器
????????????myProperty.Name?=?"Anytao";
????????????
//觸發get訪問器
????????????Console.WriteLine(myProperty.Name);
????????????myProperty.Age?
=?66;
????????????Console.WriteLine(myProperty.Age.ToString());
????????????Console.ReadLine();
????????}
????}

?


2.3. 區別與比較

通過對概念的澄清和歷史的回溯,我們知道特性和屬性只是在名稱上有過糾葛,在MSDN上關于attribute的中文解釋甚至還是屬性,但是我同意更通常的稱呼:特性。在功能上和應用上,二者其實沒有太多模糊的概念交叉,因此也沒有必要來比較其應用的異同點。本文則以特性的概念為重點,來討論其應用的場合和規則。

我理解的定制特性,就是為目標元素,可以是數據集、模塊、類、屬性、方法、甚至函數參數等加入附加信息,類似于注釋,但是可以在運行期以反射的方式獲得。定制特性主要應用在序列化、編譯器指令、設計模式等方面。

3. 通用規則

  • 定制特性可以應用的目標元素可以為:程序集(assembly)、模塊(module)、類型(type)、屬性(property)、事件(event)、字段(field)、方法(method)、參數(param)、返回值(return),應該全了。
  • 定制特性以[,]形式展現,放在緊挨著的元素上,多個特性可以應用于同一元素,特性間以逗號隔開,以下表達規則有效:[AttributeUsage][ Flags]、[AttributeUsage, Flags]、[Flags, AttibuteUsageAttribute]、[AttributeUsage(), FlagesAttribute()]
  • attibute實例,是在編譯期進行初始化,而不是運行期。
  • C#允許以指定的前綴來表示特性所應用的目標元素,建議這樣來處理,因為顯式處理可以消除可能帶來的二義性。例如:?? using?System;?

    namespace?Anytao.net?
    {
    ????[assembly:?MyAttribute(
    1)]??????????//應用于程序集
    ????[moduel:?MyAttribute(2)]????????????//應用于模塊
    ????pubic?class?Attribute_how2do
    ????{
    ????????
    //
    ????}?
    }

    ?

  • 定制特性類型,必須直接或者間接的繼承自System.Attribute類,而且該類型必須有公有構造函數來創建其實例。
  • 所有自定義的特性名稱都應該有個Attribute后綴,這是習慣性約定。
  • 定制特性也可以應用在其他定制特性上,這點也很好理解,因為定制特性本身也是一個類,遵守類的公有規則。例如很多時候我們的自定義定制特性會應用AttributeUsageAttribute特性,來控制如何應用新定義的特性。?? [AttributeUsageAttribute(AttributeTarget.All),
    AllowMultiple?
    =?true,?
    Inherited?
    =?true]
    class?MyNewAttribute:?System.Attribute
    {

    //
    }?

    ?

  • 定制特性不會影響應用元素的任何功能,只是約定了該元素具有的特質。
  • 所有非抽象特性必須具有public訪問限制。
  • 特性常用于編譯器指令,突破#define, #undefine, #if, #endif的限制,而且更加靈活。
  • 定制特性常用于在運行期獲得代碼注釋信息,以附加信息來優化調試。
  • 定制特性可以應用在某些設計模式中,如工廠模式。
  • 定制特性還常用于位標記,非托管函數標記、方法廢棄標記等其他方面。
  • 4. 特性的應用

    4.1. 常用特性

    常用特性,也就是.NET已經提供的固有特性,事實上在.NET框架中已經提供了豐富的固有特性由我們發揮,以下精選出我認為最常用、最典型的固有特性做以簡單討論,當然這只是我的一家之言,亦不足道。我想了解特性,還是從這里做為起點,從.NET提供的經典開始,或許是一種求知的捷徑,希望能給大家以啟示。

  • AttributeUsage

    AttributeUsage特性用于控制如何應用自定義特性到目標元素。關于AttributeTargetsAllowMultipleInheritedValidOn,請參閱示例說明和其他文檔。我們已經做了相當的介紹和示例說明,我們還是在實踐中自己體會更多吧。

  • Flags

    以Flags特性來將枚舉數值看作位標記,而非單獨的數值,例如:?

    enum?Animal
    {
    ????Dog?????
    =?0x0001,
    ????Cat?????
    =?0x0002,
    ????Duck????
    =?0x0004,
    ??Chicken?
    =?0x0008
    }

    因此,以下實現就相當輕松,?

    Animal?animals?=?Animal.Dog?|?Animal.Cat;
    Console.WriteLine(animals.ToString());

    請猜測結果是什么,答案是:"Dog, Cat"。如果沒有Flags特別,這里的結果將是"3"。關于位標記,也將在本系列的后續章回中有所交代,在此只做以探討止步。

  • DllImport

    DllImport特性,可以讓我們調用非托管代碼,所以我們可以使用DllImport特性引入對Win32 API函數的調用,對于習慣了非托管代碼的程序員來說,這一特性無疑是救命的稻草。?

    using?System;
    using?System.Runtime.InteropServices;

    namespace?Anytao.net
    {
    ????
    class?MainClass?
    ????{
    ???????[DllImport(
    "User32.dll")]
    ???????
    public?static?extern?int?MessageBox(int?hParent,?string?msg,?string?caption,?int?type);

    ???????
    static?int?Main()?
    ???????{
    ??????????
    return?MessageBox(0,?"How?to?use?attribute?in?.NET",?"Anytao_net",?0);
    ??????}
    ????}
    }
  • Serializable

    Serializable特性表明了應用的元素可以被序列化(serializated),序列化和反序列化是另一個可以深入討論的話題,在此我們只是提出概念,深入的研究有待以專門的主題來呈現,限于篇幅,此不贅述。

  • Conditional

    Conditional特性,用于條件編譯,在調試時使用。注意:Conditional不可應用于數據成員和屬性。

  • 還有其他的重要特性,包括:DescriptionDefaultValueCategoryReadOnlyBrowerAble等,有時間可以深入研究。

    4.2. 自定義特性

    既然attribute,本質上就是一個類,那么我們就可以自定義更特定的attribute來滿足個性化要求,只要遵守上述的12條規則,實現一個自定義特性其實是很容易的,典型的實現方法為:

  • 定義特性??

    ?

    ????[AttributeUsage(AttributeTargets.Class?|
    ????????AttributeTargets.Method,
    ????????Inherited?
    =?true)]
    ????
    public?class?TestAttribute?:?System.Attribute
    ????{
    ????????
    public?TestAttribute(string?message)
    ????????{
    ????????????Console.WriteLine(message);
    ????????}
    ????????
    public?void?RunTest()
    ????????{
    ????????????Console.WriteLine(
    "TestAttribute?here.");
    ????????}
    ????}

    ?

  • 應用目標元素?? ????????[Test("Error?Here.")]
    ????????
    public?void?CannotRun()
    ????????{
    ????????????
    //
    ????????}

    ?

  • 獲取元素附加信息

    如果沒有什么機制來在運行期來獲取Attribute的附加信息,那么attribute就沒有什么存在的意義。因此,.NET中以反射機制來實現在運行期獲取attribute信息,實現方法如下:??

    ?

    ?

    public?static?void?Main()
    ????????{
    ????????????Tester?t?
    =?new?Tester();
    ????????????t.CannotRun();

    ????????????Type?tp?
    =?typeof(Tester);
    ????????????MethodInfo?mInfo?
    =?tp.GetMethod("CannotRun");????????????
    ????????????TestAttribute?myAtt?
    =?(TestAttribute)Attribute.GetCustomAttribute(mInfo,?typeof(TestAttribute));
    ????????????myAtt.RunTest();
    ????????}

    ?

  • 5. 經典示例

    ?

    5.1 小菜一碟

    啥也不說了,看注釋吧。

    using?System;
    using?System.Reflection;?????????????????????????????????//應用反射技術獲得特性信息

    namespace?Anytao.net
    {
    ????
    //定制特性也可以應用在其他定制特性上,
    ????
    //應用AttributeUsage,來控制如何應用新定義的特性
    ????[AttributeUsageAttribute(AttributeTargets.All,???????//可應用任何元素
    ????????AllowMultiple?=?true,????????????????????????????//允許應用多次
    ????????Inherited?=?false)]??????????????????????????????//不繼承到派生類
    ????
    //特性也是一個類,
    ????
    //必須繼承自System.Attribute類,
    ????
    //命名規范為:"類名"+Attribute。????????
    ????public?class?MyselfAttribute?:?System.Attribute
    ????{
    ????????
    //定義字段
    ????????private?string?_name;
    ????????
    private?int?_age;
    ????????
    private?string?_memo;

    ????????
    //必須定義其構造函數,如果不定義有編譯器提供無參默認構造函數
    ????????public?MyselfAttribute()
    ????????{
    ????????}
    ????????
    public?MyselfAttribute(string?name,?int?age)
    ????????{
    ????????????_name?
    =?name;
    ????????????_age?
    =?age;
    ????????}

    ????????
    //定義屬性
    ????????
    //顯然特性和屬性不是一回事兒
    ????????public?string?Name
    ????????{
    ????????????
    get?{?return?_name?==?null???string.Empty?:?_name;?}
    ????????}

    ????????
    public?int?Age
    ????????{
    ????????????
    get?{?return?_age;?}
    ????????}

    ????????
    public?string?Memo
    ????????{
    ????????????
    get?{?return?_memo;?}
    ????????????
    set?{?_memo?=?value;?}
    ????????}

    ????????
    //定義方法
    ????????public?void?ShowName()
    ????????{
    ????????????Console.WriteLine(
    "Hello,?{0}",?_name?==?null???"world."?:?_name);
    ????????}
    ????}

    ????
    //應用自定義特性
    ????
    //可以以Myself或者MyselfAttribute作為特性名
    ????
    //可以給屬性Memo賦值
    ????[Myself("Emma",?25,?Memo?=?"Emma?is?my?good?girl.")]
    ????
    public?class?Mytest
    ????{
    ????????
    public?void?SayHello()
    ????????{
    ????????????Console.WriteLine(
    "Hello,?my.net?world.");
    ????????}
    ????}

    ????
    public?class?Myrun
    ????{
    ????????
    public?static?void?Main(string[]?args)
    ????????{
    ????????????
    //如何以反射確定特性信息
    ????????????Type?tp?=?typeof(Mytest);
    ????????????MemberInfo?info?
    =?tp;
    ????????????MyselfAttribute?myAttribute?
    =
    ????????????????(MyselfAttribute)Attribute.GetCustomAttribute(info,?typeof(MyselfAttribute));
    ????????????
    if?(myAttribute?!=?null)
    ????????????{
    ????????????????
    //嘿嘿,在運行時查看注釋內容,是不是很爽
    ????????????????Console.WriteLine("Name:?{0}",?myAttribute.Name);
    ????????????????Console.WriteLine(
    "Age:?{0}",?myAttribute.Age);
    ????????????????Console.WriteLine(
    "Memo?of?{0}?is?{1}",?myAttribute.Name,?myAttribute.Memo);
    ????????????????myAttribute.ShowName();
    ????????????}

    ????????????
    //多點反射
    ????????????object?obj?=?Activator.CreateInstance(typeof(Mytest));

    ????????????MethodInfo?mi?
    =?tp.GetMethod("SayHello");
    ????????????mi.Invoke(obj,?
    null);
    ????????????Console.ReadLine();
    ????????}
    ????}
    }

    ?啥也別想了,自己做一下試試。

    5.2 他山之石

    • MSDN認為,特性 (Attribute) 描述如何將數據序列化,指定用于強制安全性的特性,并限制實時 (JIT) 編譯器的優化,從而使代碼易于調試。屬性 (Attribute) 還可以記錄文件名或代碼作者,或在窗體開發階段控制控件和成員的可見性。
    • dudu?Boss收藏的系列文章《Attribute在.net編程中的應用》,給你應用方面的啟示會很多,值得研究。
    • 亞歷山大同志?的系列文章《手把手教你寫ORM(六)》中,也有很好的詮釋。
    • idior的文章《Remoting基本原理及其擴展機制》也有收獲,因此補充。

    6. 結論

    ?Attribute是.NET引入的一大特色技術,但在博客園中討論的不是很多,所以拿出自己的體會來分享,希望就這一技術要點進行一番登堂入室的引導。更深層次的應用,例如序列化、程序安全性、設計模式多方面都可以挖掘出閃耀的金子,這就是.NET在技術領域帶來的百變魅力吧。希望大家暢所欲言,來完善和補充作者在這方面的不全面和認知上的不深入,那將是作者最大的鼓勵和動力。
    ?

    參考文獻

    (USA)Stanley B.Lippman, C# Primer?

    總結

    以上是生活随笔為你收集整理的[你必须知道的.NET] 第三回:历史纠葛:特性和属性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 在线不卡av电影 | 日本久久久网站 | 韩国黄色一级片 | 国产黄色av片 | 最新国产黄色网址 | 亚洲精品久久久久国产 | 成人av影视在线观看 | 欧美激情视频在线播放 | 在线激情网站 | 日本中文字幕影院 | 欧美在线一 | 国产一区二区三区在线免费观看 | 国产自在线拍 | 久久久全国免费视频 | 国产亲伦免费视频播放 | 久久性生活视频 | 在线免费视频一区二区 | 亚洲免费黄色片 | 在线观看国产欧美 | 纯爱无遮挡h肉动漫在线播放 | 91精品日韩 | 91波多野结衣| 双性皇帝高h喷汁呻吟 | 深夜视频一区二区三区 | 亚洲三区在线播放 | 男人的天堂在线视频 | 不许穿内裤随时挨c调教h苏绵 | 淫欲av | 日韩aaaaaa | 超碰在线超碰 | 人妻久久一区二区 | 亚洲伦理影院 | 精品动漫3d一区二区三区免费版 | 国产精品欧美精品 | 横恋母在线观看 | 4438全国最大成人网 | 人物动物互动39集免费观看 | 豆国产97在线 | 亚洲 | 日本高清视频在线观看 | 亚洲美女av网站 | 日韩欧美高清在线 | 91免费在线播放 | 日韩三级免费 | 午夜精品久久99蜜桃的功能介绍 | 精品亚洲国产成av人片传媒 | 亚洲a在线播放 | 亚洲欧美乱日韩乱国产 | 绯色av一区二区 | 看一级大片 | 久久国产精品99久久人人澡 | 人人妻人人玩人人澡人人爽 | 国产美女无遮挡永久免费观看 | 中国女人一级一次看片 | 91精品视频一区二区三区 | 久久国产亚洲精品无码 | 毛片基地在线播放 | 四虎影院新网址 | 久久国产精品波多野结衣av | 在线日韩一区二区 | 深夜福利在线播放 | 成人小视频在线免费观看 | 国产黄免费 | 麻豆国产网站 | av全黄 | jizz欧美性11 | 成人精品免费看 | 日韩激情在线播放 | 国产中文欧美日韩在线 | 久久神马 | 无码人妻一区二区三区在线 | 综合色网站 | 黄色小视频在线观看免费 | 狠狠爱夜夜爱 | 日韩一级色片 | 日韩人妻无码精品久久久不卡 | 亚洲国产精品视频 | 熟睡侵犯の奶水授乳在线 | av免费亚洲 | 免费观看污| 欧美成人r级一区二区三区 中文无码一区二区三区在线观看 | 日韩伦理一区二区 | 蜜桃综合 | 欧美一区二区激情 | 大胸美女无遮挡 | 伊人精品视频 | 黄色a级在线观看 | 日韩在线观看免费网站 | 动漫涩涩免费网站在线看 | 国产美女免费视频 | 国产.com | 在线黄色大片 | av不卡中文字幕 | 欧美日韩国产免费 | 色综合视频网 | 色综合天天综合网国产成人网 | 999久久精品| 午夜影院啊啊啊 | 欧美 日韩 人妻 高清 中文 | 金鱼妻日剧免费观看完整版全集 |