<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文開始之前,首先我想問下大家對於屬性和特性知道多少?屬性和特性又有何區別?
對於該單詞,我更想把它稱之為:特性。對於屬性和特性就是名稱上有糾葛(不知道你們迷不迷,反正我寫本文之前我是迷了),什麼是屬性?屬性是物件導向程式設計的基本概念,提供了對私有欄位的存取封裝,在C#中以get和set存取器方法實現對可讀可寫屬性的操作,提供了安全和靈活的資料存取封裝。什麼是特性?下面內容就說明下:
使用特性,可以有效地將後設資料或宣告性資訊與程式碼(程式集、型別、方法、屬性等)相關聯。將特性與程式實體相關聯後,可以在執行時使用 反射 這項技術查詢特性。詳情 用於新增後設資料,如編譯器指令和註釋、描述、方法、類等其他資訊。.Net 框架提供了兩種型別的特性:預定義特性和自定義特性。
簡單總結:客製化特性attribute,本質上是一個類,其為目標元素提供關聯附加資訊,並在執行期以反射的方式來獲取附加資訊。
AttributeUsage特性用於控制如何應用自定義特性到目標元素,有三個資料屬性可用以修飾我們的自定義的屬性
ValidOn | 規定特性可被放置的語言元素。它是列舉元 AttributeTargets 的值的組合。預設值是 AttributeTargets.All。 |
---|---|
AllowMultiple | 定義了是否可在同一個程式實體上同時使用多個屬性進行修飾 |
Inherited | 定義了自定義屬性的修飾是否可由被修飾類的派生類繼承 |
[AttributeUsage(validOn: AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public class HelpAttribute : Attribute { }
表示該特定只能標識在類上,並且同一個類上只能用一個屬性修飾,並且自定義屬性的修飾不能由修飾類的派生類繼承。
以Flags特性來將列舉數值看作位標記,而非單獨的數值,例如我有如下的一個需求,當我想要取得使用者資訊的時候,會先從本地快取中查詢,找不到然後從分散式快取中查詢,最後找不到再從資料庫中查詢。但是有些場景我又不需要查詢資料庫。
所以會建立下面的這種模型
public UserEntity GetUserInfo(List<DataSource> dataSources) { var xxxx = new UserEntity(); if(dataSources.Any(DataSource.Local) { //從本地快取中獲取 return xxxx; } if(dataSources.Any(DataSource.Distribution) { //從分散式快取中獲取 //更新本地快取 return xxxx; } if(dataSources.Any(DataSource.DB) { //從DB中獲取 //更新分散式快取 //更新本地快取 } return xxxx; }
但是每次呼叫者都去構建一個List,比較麻煩,此時我們可以使用列舉中的Flags特性,修改程式如下:
首先是列舉的定義上,要加上 [Flags] 特性標籤,並且定義 一般都是 2的n次方,主要是便於位移運算
/// <summary> ///資料取得地方 /// </summary> [Flags] public enum DataSource { /// <summary> ///本地快取 /// </summary> [Description("本地快取")] LocalCache = 1, /// <summary> ///分散式快取 /// </summary> [Description("分散式快取")] DistributeCache = 2, /// <summary> ///資料庫 /// </summary> [Description("資料庫")] DB = 4, }
修改程式碼
public UserEntity GetUserInfo(DataSource dataSources) { var xxxx = new UserEntity(); if(dataSources.HasFlags(DataSource.Local) { //從本地快取中獲取 return xxxx; } if(dataSources.HasFlags(DataSource.Distribution) { //從分散式快取中獲取 //更新本地快取 return xxxx; } if(dataSources.HasFlags(DataSource.DB) { //從DB中獲取 //更新分散式快取 //更新本地快取 } return xxxx; }
呼叫的地方,可以用過“|”來指定,例如我只想用分散式快取和資料庫,那麼:
var userInfo = GetUserInfo(DataSource.Distribution | DataSource.DB);
該例子摘抄自:https://www.jb51.net/article/254408.htm
DllImport特性,可以讓我們呼叫非受控程式碼,所以我們可以使用DllImport特性引入對Win32 API函數的呼叫
[System.Runtime.InteropServices.DllImport("user32.dll")] extern static void SampleMethod();
Serializable特性表明了應用的元素可以被序列化(serializated)
[Serializable] public class SampleClass { // Objects of this type can be serialized. }
Conditional特性,用於條件編譯,在偵錯時使用。注意:Conditional不可應用於資料成員和屬性。
可通過定義特性類建立自己的自定義特性,特性類是直接或間接派生自 Attribute 的類,可快速輕鬆地識別後設資料中的特性定義。假設我們希望使用編寫類的程式設計師名字來標記該類,那麼我們就需要自定義一個Author特性類
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)] public class AuthorAttribute : Attribute { public string AuthorName; public double version; public AuthorAttribute(string authorName) { this.AuthorName = authorName; version = 1.0; } }
類名 AuthorAttribute
是該特性的名稱,即 Author
加上 Attribute
字尾。由於該類繼承自 System.Attribute
,因此它是一個自定義特性類。建構函式的引數是自定義特性的位置引數。在此範例中,name
是位置引數。所有公共讀寫欄位或屬性都是命名引數。在本例中,version
是唯一的命名引數。
請注意,使用
AttributeUsage
特性可使Author
特性僅對類和struct
宣告有效。
可按照下面的方式使用特性
[Author("張三", version = 1.1)] [Author("李四", version = 1.2)] public class SampleClass { // 業務邏輯程式碼 }
獲取自定義引數
var attr = typeof(SampleClass).GetCustomAttributes(typeof(AuthorAttribute), true);
GetCustomAttributes 會以陣列形式返回 Author 物件和任何其他特性物件
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45