91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#特性

發布時間:2020-07-07 22:11:43 來源:網絡 閱讀:503 作者:Aonaufly 欄目:編程語言

什么是特性,我自己的理解是:

特性是一種允許我們向程序集增加元數據的語言結構。它是用于保存程序結構信息的特殊的類。特性有2個基本概念:“目標”,“消費者”,就拿特殊性DebuggerStepThrough來說,編譯器就是消費者,當它遇到被此特性注冊過的Mothed時,就不會進入此Mothed執行(斷點時)會直接得到此Methed的運行結果,而次Method就是目標了。總而言之,應用了特性的語言結構叫“目標”;設計用來獲取和使用此特性的就叫“消費者”。

下面講解.Net自帶的幾個比較著名的特性

1,Obsolete : 提示Method過時

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AtrributeTest.com
{
    /// <summary>
    /// 用于測試Obsolete特性
    /// 目標:Method
    /// 消費者 : IDE
    /// </summary>
    public sealed class ObsoleteTest
    {
        [Obsolete("這個方法已經過時,請使用MyNewMethod方法",false)]
        public void MyOldMethd()
        {
            Console.WriteLine("這是一個過時的方法");
        }
        public void MyNewMethod()
        {
            Console.WriteLine("這是一個新方法");
        }
    }
}

測試:

C#特性

可以看出當IDE跳出提示時,會自動在有“Obsolete”標志的Method上劃一橫線(表示不提倡使用),我在Obsolete的構造函數中提示“這個方法已經過時,請使用MyNewMethod方法”也只IDE提示中顯示出來。關于Obsolete的第二個參數(Boolean),它表是“是否不能使用”。如果為true,當使用了MyOldMethd方法后,編譯會報錯;反之(False的情況),只是不提倡使用。


2,Conditional : 取消Method的任何調用

這個的話我認為并沒有編譯參數好用。我先放測試代碼,再給出解釋

1,此內中有一個方法“MyTestMethod”被Conditional特性修飾

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace AtrributeTest.com
{
    /// <summary>
    /// 用于測試Condition特性
    /// 目標:Method
    /// 消費者 : IDE(將影響編譯)
    /// </summary>
    public sealed class ConditionalTest
    {
        [Conditional("IsTest")]
        public void MyTestMethod()
        {
            Console.WriteLine("這是我的測試方法,請在正式上線后注釋掉");
        }
    }
}

此方法在2處調用

①:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AtrributeTest.com
{
    /// <summary>
    /// 用于測試Obsolete特性
    /// 目標:Method
    /// 消費者 : IDE
    /// </summary>
    public sealed class ObsoleteTest
    {
        [Obsolete("這個方法已經過時,請使用MyNewMethod方法",false)]
        public void MyOldMethd()
        {
            Console.WriteLine("這是一個過時的方法");
        }
        public void MyNewMethod()
        {
            Console.WriteLine("這是一個新方法");
            ConditionalTest contTest = new ConditionalTest();
            contTest.MyTestMethod();
        }
    }
}

②:Main函數

#define IsTest
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AtrributeTest.com;
namespace AtrributeTest
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("ObsoleteTest..........................");
            ObsoleteTest obsTest = new ObsoleteTest();
            obsTest.MyNewMethod();

            Console.WriteLine("Program..........................");
            ConditionalTest conTest = new ConditionalTest();
            conTest.MyTestMethod();
            Console.ReadKey();
        }
    }
}

在Program中我定義了一個宏 IsTest , 所以在此類的Main函數中MyTestMethod是可以被執行的。但是在ObsoleteTest內中沒有定義此宏,所以此類的方法MyNewMethod中的MyTestMethod是不會被執行的。這點值得注意。實際上在IDE中已經給予了提示:

在注冊過IsTest宏的Program類,如下圖:

C#特性

在沒有注冊過宏IsTest宏的ObsoleteTest類,如下圖:

C#特性

值得注意注意的是 ,① 宏一定要放在所有using的前面 ; ②宏的定義要與[Conditional("IsTest")]后面的參數一樣,但是不能要“”(引號)

但是如果整個項目的此Method都能/不能調用 , 單單一個個在Class中加/刪宏會累死你的 。這里本人有個好方法“預處理指令”在本人的博客《C#的預處理指令的全局設計》中有,但是還有一個此特性還有一個缺點:

所有引用(調用)此Method的地方不會被編譯,但是定義它的地方會被編譯。建議還是使用#if / #endif


自定義特性:(要注意三點)

一:需要繼承Attribute類

二:需要以Attribute單詞作為后綴名

三:最好申明為sealed,需要申明此特性的消費著

好,現在來整一個Demo,現在一步步實現

①建立第一個自定義特性,如下圖

C#特性

②完整代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AtrributeTest.com
{
    /// <summary>
    /// 自定義一個特性
    /// </summary>
    [AttributeUsage(AttributeTargets.Class)]//表示此特性可以應用到那些程序結構
    public  sealed class MyTestAttribute : Attribute
    {
        private string des;
        public int Id { get; set; }
        public MyTestAttribute(string @des)
        {
            this.des = des;
        }
    }
}

③使用自定義特性

注意 : 使用反射獲取特性信息

C#特性

using System;
using AtrributeTest.com;
namespace AtrributeTest
{   
    [MyTest("我的第一個特性",Id = 1)]
    public class Program
    {
        private static void Main(string[] args)
        {
            Type @ty = typeof (Program);
            object[] arr = ty.GetCustomAttributes(false);//是否搜索父類上的特性
            MyTestAttribute my = arr[0] as MyTestAttribute;
            Console.WriteLine("特性類的des : {0}" , my.des);
            Console.WriteLine("特性類的ID號 : {0}" ,my.Id);
            Console.ReadKey();
        }
    }
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇信县| 罗定市| 江达县| 电白县| 大邑县| 卫辉市| 承德县| 鹤庆县| 廊坊市| 大荔县| 即墨市| 呈贡县| 涟水县| 水城县| 巴彦淖尔市| 安达市| 洛宁县| 潮安县| 那坡县| 凤城市| 宣城市| 石阡县| 德江县| 电白县| 柘荣县| 探索| 宜川县| 张家界市| 桐柏县| 通州市| 新昌县| 轮台县| 增城市| 繁峙县| 永福县| 崇礼县| 渝北区| 大埔区| 于都县| 广安市| 和田县|