真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C#特性

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

創(chuàng)新互聯(lián)主營(yíng)麻江網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App定制開發(fā),麻江h(huán)5微信平臺(tái)小程序開發(fā)搭建,麻江網(wǎng)站營(yíng)銷推廣歡迎麻江等地區(qū)企業(yè)咨詢

特性是一種允許我們向程序集增加元數(shù)據(jù)的語(yǔ)言結(jié)構(gòu)。它是用于保存程序結(jié)構(gòu)信息的特殊的類。特性有2個(gè)基本概念:“目標(biāo)”,“消費(fèi)者”,就拿特殊性DebuggerStepThrough來說,編譯器就是消費(fèi)者,當(dāng)它遇到被此特性注冊(cè)過的Mothed時(shí),就不會(huì)進(jìn)入此Mothed執(zhí)行(斷點(diǎn)時(shí))會(huì)直接得到此Methed的運(yùn)行結(jié)果,而次Method就是目標(biāo)了??偠灾?,應(yīng)用了特性的語(yǔ)言結(jié)構(gòu)叫“目標(biāo)”;設(shè)計(jì)用來獲取和使用此特性的就叫“消費(fèi)者”。

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

1,Obsolete : 提示Method過時(shí)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AtrributeTest.com
{
    /// 
    /// 用于測(cè)試Obsolete特性
    /// 目標(biāo):Method
    /// 消費(fèi)者 : IDE
    /// 
    public sealed class ObsoleteTest
    {
        [Obsolete("這個(gè)方法已經(jīng)過時(shí),請(qǐng)使用MyNewMethod方法",false)]
        public void MyOldMethd()
        {
            Console.WriteLine("這是一個(gè)過時(shí)的方法");
        }
        public void MyNewMethod()
        {
            Console.WriteLine("這是一個(gè)新方法");
        }
    }
}

測(cè)試:

C#特性

可以看出當(dāng)IDE跳出提示時(shí),會(huì)自動(dòng)在有“Obsolete”標(biāo)志的Method上劃一橫線(表示不提倡使用),我在Obsolete的構(gòu)造函數(shù)中提示“這個(gè)方法已經(jīng)過時(shí),請(qǐng)使用MyNewMethod方法”也只IDE提示中顯示出來。關(guān)于Obsolete的第二個(gè)參數(shù)(Boolean),它表是“是否不能使用”。如果為true,當(dāng)使用了MyOldMethd方法后,編譯會(huì)報(bào)錯(cuò);反之(False的情況),只是不提倡使用。

2,Conditional : 取消Method的任何調(diào)用

這個(gè)的話我認(rèn)為并沒有編譯參數(shù)好用。我先放測(cè)試代碼,再給出解釋

1,此內(nèi)中有一個(gè)方法“MyTestMethod”被Conditional特性修飾

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace AtrributeTest.com
{
    /// 
    /// 用于測(cè)試Condition特性
    /// 目標(biāo):Method
    /// 消費(fèi)者 : IDE(將影響編譯)
    /// 
    public sealed class ConditionalTest
    {
        [Conditional("IsTest")]
        public void MyTestMethod()
        {
            Console.WriteLine("這是我的測(cè)試方法,請(qǐng)?jiān)谡缴暇€后注釋掉");
        }
    }
}

此方法在2處調(diào)用

①:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AtrributeTest.com
{
    /// 
    /// 用于測(cè)試Obsolete特性
    /// 目標(biāo):Method
    /// 消費(fèi)者 : IDE
    /// 
    public sealed class ObsoleteTest
    {
        [Obsolete("這個(gè)方法已經(jīng)過時(shí),請(qǐng)使用MyNewMethod方法",false)]
        public void MyOldMethd()
        {
            Console.WriteLine("這是一個(gè)過時(shí)的方法");
        }
        public void MyNewMethod()
        {
            Console.WriteLine("這是一個(gè)新方法");
            ConditionalTest contTest = new ConditionalTest();
            contTest.MyTestMethod();
        }
    }
}

②:Main函數(shù)

#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中我定義了一個(gè)宏 IsTest , 所以在此類的Main函數(shù)中MyTestMethod是可以被執(zhí)行的。但是在ObsoleteTest內(nèi)中沒有定義此宏,所以此類的方法MyNewMethod中的MyTestMethod是不會(huì)被執(zhí)行的。這點(diǎn)值得注意。實(shí)際上在IDE中已經(jīng)給予了提示:

在注冊(cè)過IsTest宏的Program類,如下圖:

C#特性

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

C#特性

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

但是如果整個(gè)項(xiàng)目的此Method都能/不能調(diào)用 , 單單一個(gè)個(gè)在Class中加/刪宏會(huì)累死你的 。這里本人有個(gè)好方法“預(yù)處理指令”在本人的博客《C#的預(yù)處理指令的全局設(shè)計(jì)》中有,但是還有一個(gè)此特性還有一個(gè)缺點(diǎn):

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

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

一:需要繼承Attribute類

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

三:最好申明為sealed,需要申明此特性的消費(fèi)著

好,現(xiàn)在來整一個(gè)Demo,現(xiàn)在一步步實(shí)現(xiàn)

①建立第一個(gè)自定義特性,如下圖

C#特性

②完整代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AtrributeTest.com
{
    /// 
    /// 自定義一個(gè)特性
    /// 
    [AttributeUsage(AttributeTargets.Class)]//表示此特性可以應(yīng)用到那些程序結(jié)構(gòu)
    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("我的第一個(gè)特性",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號(hào) : {0}" ,my.Id);
            Console.ReadKey();
        }
    }
}

當(dāng)前名稱:C#特性
鏈接分享:http://weahome.cn/article/jdpecg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部