記錄一下 Attribute 的學習紀錄
啊啊 記錄一下Attribute的基本用法,Attribute英文直接翻譯是「屬性」但是「屬性」這個名詞已經有Property佔用了,為了避免混淆,所以個人將Attribute翻譯為「特性」,而 Property 在這篇則翻譯為「屬性」
目前我的Attribute文章會寫兩到三篇左右,本篇只會記錄基本的用法跟自己常用的用法,第二篇則是會記錄該如何自定義Attribute,第三篇則是會記錄簡單的反射用法(這篇可能會融進第二篇)
這篇要記錄的有以下4點
- Attribute 和 Property 意義跟實際上的差別
- Conditional
- 多個識別項
- Obsolete
Attribute 和 Property 意義跟實際上的差別
Attribute 和 Property 是完全不同的東西,但英文的直接翻譯上都會被稱之為「屬性」,之前也有看到別人把Attribute翻作「特徵向」,但我還是比較偏好「特性」的這個翻譯。
在意義上的可以在MSDN上看見兩者不同的定義
C# 提供了一個定義宣告式標記 (Tag) 的機制,此宣告標記稱為屬性 (Attribute),可以讓您在原始程式碼中放置一些實體,來指定額外的資訊。屬性所包含的資訊可以在 Run Time 時透過反映來擷取。您可以使用預先定義屬性 (Attribute)或者您可以定義自己的自訂屬性。
簡單來說,Attribute是一個讓我們的程式可以新增「附加聲名」訊息的一個機制
屬性是提供彈性機制以讀取、寫入或計算私用欄位值的成員。 使用屬性時可將其視為公用資料成員,但實際上屬性是名為「存取子」的特殊方法。 如此可讓資料更容易存取,同時有助於提升方法的安全性和彈性。
簡單來說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
感謝各位的收看 <(_ _)>