首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

[你必須知道的.NET] 第三回:特性與屬性的歷史糾葛 (下)

     編輯:關於C語言

常用內建特性

AttributeUsage

控制自訂特性可套用的目標元素、是否允許重複、是否可繼承等。

Flags

將列舉視為位元旗標而非獨立值:

[Flags]
enum Animal
{
    Dog = 0x0001,
    Cat = 0x0002,
    Duck = 0x0004,
    Chicken = 0x0008
}

Animal animals = Animal.Dog | Animal.Cat;
Console.WriteLine(animals); // 輸出 "Dog, Cat" 而非 "3"

DllImport

呼叫非受控程式碼(Win32 API):

[DllImport("User32.dll")]
public static extern int MessageBox(int hWnd, string text, string caption, int type);

MessageBox(0, "Hello .NET", "Title", 0);

Serializable

標記型別可序列化,支援二進制、XML、JSON 等序列化格式。

Conditional

條件編譯,常用於除錯:

[Conditional("DEBUG")]
void DebugLog(string msg) { Console.WriteLine(msg); }

// 只有定義 DEBUG 符號時才會編譯呼叫

其他實用特性

  • Description、DefaultValue、Category:設計工具支援
  • ReadOnly、Browsable:屬性格控制

自訂特性實作

1. 定義特性類別

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

2. 套用至目標元素

[Test("Error Here.")]
public void CannotRun() { }

3. 運行時透過反射讀取

var tp = typeof(Tester);
var method = tp.GetMethod("CannotRun");
var attr = (TestAttribute)Attribute.GetCustomAttribute(method, typeof(TestAttribute));
attr?.RunTest();

特性的核心價值

  • 中繼資料延伸:為程式碼元素附加額外語義資訊
  • 運行時發現:透過反射機制動態讀取,驅動框架行為
  • 編譯器指令:超越傳統 #if/#endif 的靈活條件編譯
  • 設計模式支援:工廠模式、策略模式等的標記與發現

總結

特性 是 .NET 中繼資料系統的核心擴展機制。掌握內建特性並能建立自訂特性,是開發高階框架、程式碼分析工具、序列化引擎的關鍵能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved