C# 學習筆記 - Conditional 和 Obsolete 的 Attribute 特性的簡介與用法

記錄一下 Attribute 的學習紀錄

啊啊 記錄一下Attribute的基本用法,Attribute英文直接翻譯是「屬性」但是「屬性」這個名詞已經有Property佔用了,為了避免混淆,所以個人將Attribute翻譯為「特性」,而 Property 在這篇則翻譯為「屬性」

目前我的Attribute文章會寫兩到三篇左右,本篇只會記錄基本的用法跟自己常用的用法,第二篇則是會記錄該如何自定義Attribute,第三篇則是會記錄簡單的反射用法(這篇可能會融進第二篇)

這篇要記錄的有以下4點

  • Attribute 和 Property 意義跟實際上的差別
  • Conditional
  • 多個識別項
  • Obsolete

Attribute 和 Property 意義跟實際上的差別

Attribute 和 Property 是完全不同的東西,但英文的直接翻譯上都會被稱之為「屬性」,之前也有看到別人把Attribute翻作「特徵向」,但我還是比較偏好「特性」的這個翻譯。

在意義上的可以在MSDN上看見兩者不同的定義

Attribute的官方定義

C# 提供了一個定義宣告式標記 (Tag) 的機制,此宣告標記稱為屬性 (Attribute),可以讓您在原始程式碼中放置一些實體,來指定額外的資訊。屬性所包含的資訊可以在 Run Time 時透過反映來擷取。您可以使用預先定義屬性 (Attribute)或者您可以定義自己的自訂屬性。

簡單來說,Attribute是一個讓我們的程式可以新增「附加聲名」訊息的一個機制

Property的官方定義

屬性是提供彈性機制以讀取、寫入或計算私用欄位值的成員。 使用屬性時可將其視為公用資料成員,但實際上屬性是名為「存取子」的特殊方法。 如此可讓資料更容易存取,同時有助於提升方法的安全性和彈性。

簡單來說Property是類型(class)、結構(structure)、介面(interface)跟命名的成員,他使用存取子(accessor)讓變數的值可被讀寫

從以上兩個定義就可以發現他們兩個在翻譯上是相同的,但實際上是完全不同的東西

Conditional

這一部分要記錄的是 Attribute 的 Conditional 

Conditional 的翻譯是「條件」也就是說執行他的條件是什麼狀態,一般在開發時會有兩種執行模式一種是用於平時開發偵錯測試時的「DEBUG」模式另一種則是發布時用的「RELEASE」模式,在圖中可以看見執行更改模式的地方

現在用簡單的Code來作為展示與說明Attribute

using System;
using System.Diagnostics;

namespace Attribute_練習
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass.ShowMessage("In Main");
            Method1();
            Console.Read();
        }
        
        static void Method1()
        {
           MyClass.ShowMessage("Method1");
        }
    }

    public class MyClass
    {
        [Conditional("DEBUG")]
        public static void ShowMessage(string msg)
        {
            Console.WriteLine(msg);
        }
    }
}

以上的Code顯而易見的是我建立了另一個Class而裡面有一個ShowMessage的Method,在這一個Method的上面可以看見我加入了一個Conditional,而這個Conditional我設定在Debug模式下才能夠使用,所以如果我現在用Debug模式執行程式Console則會出現以下的畫面

如果將 Debug 模式設成 Release 則會發現執行的結果是什麼事情都不會發生。

PS:若想要在 Release 模式下執行條件為 DEBUG 的方法,也可以使用前置處理器指示詞 #define 來定義出 DEBUG 就可以在 release 下執行 Conditional 為 debug 的 Method 

多個識別項

我們也可以讓一個方法擁有多個 Conditional 屬性,擁有多個 Conditional 屬性就會有兩種邏輯,一種是 AND 、一種則是 OR 

首先先來說說 OR 的邏輯,OR 的邏輯表示方法的 Code 如下

public class MyClass
{
    [Conditional("DEBUG"), Conditional("B")]
    public static void ShowMessage(string msg)
    {
        Console.WriteLine(msg);
    }
}

以上程式碼的意思是在 DEBUG 模式「或」有 #define B 則會執行

再來要說的是 AND 邏輯,AND 邏輯的表示方法的 Code 如下

public class MyClass
{
    [Conditional("DEBUG")]
    public static void ShowMessage(string msg)
    {
        ShowMessage2();
    }

    [Conditional("B")]
    public static void ShowMessage2()
    {
        Console.WriteLine("Message2");
    }
}

以上的程式碼就是在 DEBUG 模式「及」有 #define B 才會執行

Obsolete

Obsolete 的官方定義如下

Obsolete 屬性 (Attribute) 會標記不再建議使用的程式實體 (Entity)。每次使用標記為過時的實體時,會視設定此屬性的方法,產生警告或是錯誤。

假設今天我們有一段程式代碼,在今過一段時間的開發後,這一段程式代碼已經過時了,不再使用,或是不建議使用時,就可以利用Obsolete這一個Attribute來做標記,其使用方法如下

public class MyClass
{
    [Obsolete("Don't use Old Method!")]
    public static void ShowMessage(string msg)
    {
        Console.WriteLine(msg);
    }
}

如果我們使用到了這一個被標記為Obsolete的方法時,系統則會跳出警告,並顯示出我們所寫的提示「Dont' use Old Method!」,其系統顯示時的畫面如下

如果今天要讓我們在編譯時直接出錯則在Obsolete帶入一個布林參數 true就 會出現error 其使用方法如下

public class MyClass
{
    [Obsolete("Don't use Old Method!",true)]
    public static void ShowMessage(string msg)
    {
        Console.WriteLine(msg);
    }
}

在使用這一個方法的程式碼就會出現錯誤,系統下方也會出現錯誤的提示,其畫面如下

以上都是基本的Attribute用法,之後會再寫一個該如何自定義Attribute

Attribute十分的常見,在開發的時候也時常用到像是在ASP.NET 中 會用到 HttpPost 或是 ActionFilter 的 Attribute ,之後有時間再把自己常用的這兩個一起整理出來,避免之後沒有用到又忘記www

感謝各位的收看 <(_ _)>