上篇文章講述了C#反射知識點,本文將介紹C#特性(Attribute)的知識點。C#特性(Attribute)是一種強大的元數(shù)據(jù)機制,用于為代碼元素(如類、方法、屬性等)添加信息,以影響它們的行為或提供額外的信息。本文將介紹C#特性每個.NET開發(fā)都應(yīng)熟悉的知識點,希望對大家開發(fā)有一定的幫助。
1、特性的基本概念
公共語言運行時使你能夠添加類似于關(guān)鍵字的描述性聲明(稱為特性),以便批注編程元素(如類型、字段、方法和屬性),它是以方括號([])的形式附加到代碼元素上,并可包含參數(shù)。特性的定義通常是通過創(chuàng)建一個繼承自System.Attribute的自定義類來實現(xiàn)的。下面是一個簡單的特性定義示例,是.NET默認(rèn)創(chuàng)建最小api的官方示例:
??[HttpGet(Name?=?"GetWeatherForecast")]//特性
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
以上特性是http的Get請求特性,對外的鏈接名稱是GetWeatherForecast。
詳解-->C#-特性(Attribute)
2、內(nèi)置特性的示例
C#默認(rèn)提供了一些內(nèi)置特性,例如[Obsolete]、[Serializable]和[Conditional]等。這樣以便.NET開發(fā)很方便處理基本特定的邏輯任務(wù)。
[Obsolete] 特性:[Obsolete]特性用于標(biāo)記已過時的代碼。它可以接受一個可選的消息參數(shù),用于提供有關(guān)為何該代碼已過時的信息。
[Serializable] 特性:[Serializable]特性用于標(biāo)記一個類可以序列化,以便將對象轉(zhuǎn)換為字節(jié)流。例如:
[Serializable]
public class SerializableClass
{
// 類的成員
}
3、自定義特性
當(dāng)然大家也可以自定義特性,以滿足項目的特定需求。通常自定義特征需要繼承Attribute類,并在類上面加AttributeUsage特性,然后在這下面處理需要的邏輯,具體看之前我的一篇自定義特性的文章.NET特性(Attribute)簡單自定義。下面是自定義了一個顯示作者等信息的特性。
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class AuthorInfoAttribute : Attribute
{
public string Author { get; }
public string Version { get; }
public AuthorInfoAttribute(string author, string version)
{
Author = author;
Version = version;
}
}
//使用特性
[AuthorInfo("DotNet開發(fā)跳槽",?"1.0")]
public class MyAwesomeClass
{
// 類的成員
}
4、特性的應(yīng)用場景
那么特性通常用在什么地方呢?
特性在.NET生態(tài)系統(tǒng)中有多種應(yīng)用場景,比如代碼文檔的生成;代碼分析和驗證,比如屬性的Name字段長度驗證等;可以依賴注入;最最重要的是可以實現(xiàn)AOP(面向切面編程),比如可以用于日志記錄和性能監(jiān)控等。
5、 特性的運行時和編譯時用法
特性在C#中既具有運行時用途,通過反射機制可以在程序運行時動態(tài)檢查和操作已應(yīng)用特性的代碼元素,又具有編譯時用途,可在編譯時影響編譯器的行為,例如條件編譯、代碼生成和靜態(tài)分析,從而為開發(fā)者提供了在代碼的不同階段(編譯和運行時)對代碼進(jìn)行元數(shù)據(jù)標(biāo)記和定制的靈活性和功能。
6、特性的屬性訪問
通過反射,您可以訪問已應(yīng)用于代碼元素的特性及其參數(shù)。在上篇介紹反射(C#反射知識點)的文章已經(jīng)有所介紹。下面演示如何檢查并獲取類上的自定義特性信息。
Type type = typeof(MyAwesomeClass);
var?attributes?=?type.GetCustomAttributes(typeof(AuthorInfoAttribute),?false);
if (attributes.Length > 0 && attributes[0] is AuthorInfoAttribute authorInfo)
{
Console.WriteLine($"作者: {authorInfo.Author}, 版本號: {authorInfo.Version}");
}
//上面的代碼將打印MyAwesomeClass類的特性,展示出特性屬性的作者和版本號。
結(jié)語
本文講述了C#特性的一些知識點,比如自定義特性、內(nèi)置特性、獲取特性內(nèi)容等,這些知識點都是.NET開發(fā)應(yīng)該掌握的。
希望本文提供的C#特性知識對每個.NET開發(fā)者都有所幫助,對于C#特性的知識點,你還知道哪些?歡迎留言討論或者吐槽本文。
參考:
1、微軟官網(wǎng):
learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/language-specification/attributes
2、AI查詢
**推薦閱讀
1、.NET無處不在的特性(Attribute)1-探究
2、.NET無處不在的特性(Attribute)2-簡單自定義文章來源:http://www.zghlxwxcb.cn/news/detail-710668.html
3、面試必備:聊聊C#特性(Attribute)文章來源地址http://www.zghlxwxcb.cn/news/detail-710668.html
來源公眾號:DotNet開發(fā)跳槽??
到了這里,關(guān)于每個.NET開發(fā)都應(yīng)掌握的C#特性(Attribute)知識點的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!