主頁 >  其他 > C#基礎知識學習 之 ?? “大佬“——特性(Attribute) 的含義和用法

C#基礎知識學習 之 ?? “大佬“——特性(Attribute) 的含義和用法

2021-04-24 11:40:08 其他

C# 特性🔥(Attribute)

什么是特性🙏

特性(Attribute)是用于在運行時傳遞程式中各種元素(比如類、方法、結構、列舉、組件等)的行為資訊的宣告性標簽,您可以通過使用特性向程式添加宣告性資訊,一個宣告性標簽是通過放置在它所應用的元素前面的方括號([ ])來描述的,
特性(Attribute)用于添加元資料,如編譯器指令和注釋、描述、方法、類等其他資訊,.Net 框架提供了兩種型別的特性:預定義特性和自定義特性,

特性作用🎅

用以將元資料或宣告資訊與代碼(程 序集、型別、?方法、屬性等)相關聯

特性描述🎄

  • 特性可向程式中添加元資料
  • 可以將一個或多個特性應用到整個程式集,模塊或較小的程式元素(如類和屬性)—一個程式元素可以添加多個特性
  • 特性可以與?方法和屬性相同的?方式接受引數—特性可以接受引數
  • 程式可以使用反射檢查自己的元資料或其他程式內的元資料
  • 特性(元資料)是在編譯之后就定義好的

元資料🎁(Meta Data)

描述:元資料是一種?進制資訊,?用以對存盤在公共語?言運?行行庫可移植 可執?檔案 (PE) 檔案或存盤在記憶體中的程式進行描述,將您的代
碼編譯為 PE 檔案時,便便會將元資料插入到該檔案的一部分中,而 將代碼轉換為 Microsoft 中間語言 (MSIL)
并將其插?入到該檔案的 另一部分中,在模塊或程式集中定義和參考的每個型別和成員都
將在元資料中進行說明,當執?代碼時,運?庫將元資料加載到記憶體中,并參考它來發現有關代碼的類、成員、繼承等資訊,

在這里插入圖片描述

預定義特性💬

AttributeUsage🎉

這個重要還難!
描述:預定義特性 AttributeUsage 主要?用于標示?自定義特性可以 應?用到哪些型別的程式元素上,這個資訊由第?一個引數給出
實體:

[AttributeUsage(     
validon,//規定特性可被放置的語言元素,它是列舉? AttributeTargets 的值的組合,默認值是 AttributeTargets.All   
AllowMultiple=allowmultiple, //如果為 true,則該特性可以在同一個元素多次使?用,默認值是 false(不不可多次使?用)    
Inherited=inherited//如果為 true,則該特性可被派生類繼承,默認值是 false(不被繼承) )]

1.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[AttributeUsage(AttributeTargets.Class,AllowMultiple =true,Inherited =true)]
public class AuthorAttribute : Attribute
{
    public string author;
    public string lastDate;//最后修改的日期
    public string LastDate
    {
        get
        {
            return lastDate;
        }
        set
        {
            lastDate = value;
        }
    }
    //當前特性的建構式
    public AuthorAttribute(string author)
    {
        this.author = author;
    }
}

[AttributeUsage(AttributeTargets.Method,AllowMultiple =true)]
public class MyConditionAttribute : Attribute
{
    public MyConditionAttribute()
    { 
    }
}
[Author("Albert",lastDate = "1010.6.13"),Author("Tom",lastDate ="1010.10.13")]
public class UserAttributeDemo : MonoBehaviour
{
    public static  string log="abc";

    [MyCondition]
    public static void ShowLog()
    {
        Debug.Log(log);

    }

}

2.using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Reflection;

[AddComponentMenu("My/UsesAttributeObserver")]
[RequireComponent(typeof(Rigidbody),typeof(BoxCollider))]//組件依賴

public class UsesAttributeObserver : MonoBehaviour
{
    [Header("日志延遲時間")]
    [Range(0,1000)]
    public float  logelayTime=100;

    [SerializeField]//讓私有欄位也可以顯示到監視器面板上
    private string name;

    [ColorUsage(false)]
    public Color col;

    private void Start()
    {
        InvokeMethodByAttribute(typeof(MyConditionAttribute),"ShowLog",true,true);
    }

    /// <summary>
    /// 執行某個方法依據某個特性
    /// </summary>
    /// <param name="methodClasstype">方法所在的類的型別</param>
    /// <param name="methodName">方法名</param>
    /// <param name="isStatic">是否靜態</param>
    /// <param name="isPublic">是否公有</param>
    /// <param name="methodObj">成員方法所在物件</param>
    /// 
    private void InvokeMethodByAttribute(Type methodClasstype, string methodName,bool isStatic,bool isPublic,object methodObj=null)
    {

        BindingFlags staticFlags = isStatic ? BindingFlags.Static : BindingFlags.Instance;
        BindingFlags publicFlags = isPublic ? BindingFlags.Public  : BindingFlags.NonPublic;
        //獲取到該方法
        MethodInfo info= methodClasstype.GetMethod(methodName, staticFlags | publicFlags);
        //獲取MyConditionAttribute型別的特性
        object[] atts= info.GetCustomAttributes(typeof(MyConditionAttribute), false);

        if (atts.Length>0)
        {
            //info.Invoke();
        }

        Debug.Log("");
    }


    void PrintAttributeMsg()
    {
        //獲取型別
        Type type = typeof(UserAttributeDemo);
        //得到該型別的不可繼承的特性物件
        object[] atts= type.GetCustomAttributes(false);
        for (int i = 0; i < atts.Length; i++)
        {
            //判斷
           if(atts[i]is AuthorAttribute)
            {
                //將特性轉換為該型別
                AuthorAttribute authorObj = atts[i] as AuthorAttribute;
                Debug.Log(authorObj.author);
                Debug.Log(authorObj.lastDate);


            }

        }

    }

}

在這里插入圖片描述

Conditional🎉

**就是類似于一個密鑰,在方法前添加了[Conditional(“ZAY”)]特性后,使用時需要在最前邊宣告一個 #define ZAY 才能正常使用添加此特性的方法 **

描述:這個預定義特性標記了了?一個條件方法,其執行依賴于它頂的預處理識別符號, 它會引起方法調?用的條件編譯,取決于指定的值,比如 Debug 或 Trace,

[Conditional("ABC")]

1.using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
using Debug = UnityEngine.Debug;

public class ConditionalDemo
{
    [Conditional("ZAY")]
    public static void ShowMe()
    {
        Debug.Log("Show Me!");
    }
}
public class HasConditionDemo : MonoBehaviour
{
    void Start()
    {
        
    }
}

2.
#define ZAY
using UnityEngine;
public class UseConditionalDemo : MonoBehaviour
{
    void Start()
    {
        ConditionalDemo.ShowMe();
    }
}

在這里插入圖片描述

Obsolote🎉

可以標記此方法已過時,也可以將方法設定為直接不可用
描述: 這個預定義特性標記了不應被使?用的程式物體,它可以讓您通知編譯器?丟棄某個特定的?目 標元素,例如,當一個新方法被用在一個類中,但是您仍然想要保持類中的舊方法,您可以通過顯示一個應該使?用新方法,而不是舊方法的訊息,來把它標記為 obsolete(過時的),

示例:

[Obsolete]
[Obsolete("當前方法已過時,請使用新的方法")]
[Obsolete("過時了",false)]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class DemoFrame
{
    //[Obsolete]
    //[Obsolete("當前方法過時了,請使用NewDemoShowMe()替換他")]
    [Obsolete("當前方法過時了,請使用NewDemoShowMe()替換他",false)]
    public static void OldDemoShowMe()
     {
        Debug.Log("OldDemoShoeMe");
      }
    public static void NewDemoShowMe()
    {
      Debug.Log("NewDemoShowMe");
     }
}
public class UseObsoleteDemo : MonoBehaviour
{
    
    void Start()
    {
        DemoFrame.NewDemoShowMe();
    }

}

在這里插入圖片描述
在這里插入圖片描述

自定義特性🎈

.Net 框架允許創建自定義特性,用于存盤宣告性的資訊,且可在運行時被檢索,該資訊根據設計標準和應用程式需要,可與任何目標元素相關,
創建并使用自定義特性包含四個步驟:

  • 宣告自定義特性
  • 構建自定義特性
  • 在目標程式元素上應用自定義特性
  • 通過反射訪問特性

最后一個步驟包含撰寫一個簡單的程式來讀取元資料以便查找各種符號,元資料是用于描述其他資料的資料和資訊,該程式應使用反射來在運行時訪問特性

示例:
我這里是在Unity里做的測驗,特性的用處也更多

//添加到選單里
[AddComponentMenu("My/UsesAttributeObserver")]
//組件依賴
[RequireComponent(typeof(Rigidbody),typeof(BoxCollider))]

[SerializeField]//讓私有欄位也可以顯示到監視器面板上
private string name;

下面是自定義特性的介紹圖
在這里插入圖片描述
特性(Attribute) 也常跟 反射(Reflection) 進行配合作業,下次再簡單介紹一下反射的定義和用法
在這里插入圖片描述

下面是MSDN中對特性用途的描述:

  • 在 Web 服務中,使用 WebMethod 特性來標記方法,以指示該方法應該可通過 SOAP 協議進行呼叫, 有關更多資訊,請參見WebMethodAttribute,

  • 描述當與本機代碼進行互動操作時如何封送方法引數,有關更多資訊,請參見 MarshalAsAttribute,

  • 描述類、方法和介面的 COM 屬性,

  • 使用 DllImportAttribute 類呼叫非托管代碼,

  • 在標題、版本、說明或商標方面描述您的程式集,

  • 描述要持久性序列化類的哪些成員,

  • 描述如何映射類成員和 XML 節點以便進行 XML 序列化,

  • 描述方法的安全要求,

  • 指定用于強制安全性的特性,

  • 由實時 (JIT) 編譯器控制優化,以便易于除錯代碼,

  • 獲取有關呼叫方的資訊的方法,
    在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279551.html

標籤:其他

上一篇:記一次系統被sql注入搞掛的慘痛經歷

下一篇:web安全sql注入初識

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more