.NET Attributes

 

  • Attributes 特性
     公共語言運行時允許添加類似關鍵字的描述聲明,叫做attributes, 它對程序中的元素進行標註,如類型、字段、方法和屬性等。Attributes和Microsoft .NET Framework文件的元數據保存在一起,可以用來向運行時描述你的代碼,或者在程序運行的時候影響應用程序的行爲。
     定製特性attribute,本質上是一個類,其爲目標元素提供關聯附加信息,並在運行期以反射的方式來獲取附加信息。 attibute實例,是在編譯期進行初始化,而不是運行期。
     定製特性類型,必須直接或者間接的繼承自System.Attribute類,而且該類型必須有公有構造函數來創建其實例。所有自定義的特性名稱都應該有個Attribute後綴,這是習慣性約定。

  • 目標元素
  • assembly 程序集

  • 展現形式
     定製特性以[,]形式展現,放在緊挨着的元素上,多個特性可以應用於同一元素,特性間以逗號隔開,以下表達規則有效:[AttributeUsage][ Flags]、[AttributeUsage, Flags]、[Flags, AttibuteUsageAttribute]、[AttributeUsage(), FlagesAttribute()]

  • 消除二義性
     C#允許以指定的前綴來表示特性所應用的目標元素,建議這樣來處理,因爲顯式處理可以消除可能帶來的二義性。
using System; 

namespace Anytao.net 

{

    [assembly: MyAttribute(1)]          //應用於程序集
    [moduel: MyAttribute(2)]            //應用於模塊
    pubic class Attribute_how2do

    {
    } 

}

  • 獲取元素附加信息
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();

}

  • DllImport
     在進行互操作的時候,我們需要用DllImport來標識該方法是非託管的代碼方法,在編譯器編譯的時候它能夠正確的認識出被該特性標記的是外來代碼段,所以能順利的通過編譯,當到達程序運行的時候,也能夠正確的認識出該代碼是引用非託管的代碼,這樣就讓我們的CLR去加載非託管DLL文件,然後查找到入口點進行調用。
[DllImport("Win32DLL.dll", EntryPoint = "add", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AddNumber(int x, int y);
    • EntryPoint屬性
     EntryPoint屬性是用來確定非託管方法的入口點是什麼。
    • CharSet屬性
     CharSet屬性是用來確定在託管與非託管調用的過程中用什麼字符編碼來封送數據,因爲我們的.NET平臺是採用的Unicode編碼,而標準C++是採用的Ansi編碼,在我們瞭解了非託管代碼的編碼方式之後,我們就很確定用什麼編碼,那麼如果我們不清楚非託管代碼是用什麼語言編寫的或者不清楚它的編碼方式時,我們可以使用CharSet枚舉中的auto值,讓CLR自動爲我們處理相關細節。
    • CallingConvention屬性
     CallingConvention屬性也是一個比較重要的屬性,在平臺調用的過程中起到查找入口點的作用,在託管代碼進行非託管代碼入口點查找時,會通過CallingConvention中的值進行確認非託管入口點的調用約定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章