首页 > Windows开发 > 详细

C#的特性(Attribute)

时间:2019-12-12 14:47:55      阅读:173      评论:0      收藏:0      [点我收藏+]

 

Attribute是什么

Attribute是一种可由用户自有定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。我们可以对类、以及C#程序集中的成员进行进一步的描述。

简单地说,Attribute就是一种“附着物”——就像牡蛎吸附在船底或礁石上一样。 这些附着物的作用是为它们的附着体追加上一些额外的信息(这些信息保存在附着物的体内)——比如“这个类是我写的”或者“这个函数以前出过问题”等等

Attribute与注释的区别

注释是对程序源代码的一种说明,主要目的是给人看的,在程序被编译的时候会被编译器所丢弃,因此,它丝毫不会影响到程序的执行。

Attribute是程序代码的一部分,它不但不会被编译器丢弃,而且还会被编译器编译进程序集(Assembly)的元数据(Metadata)里。在程序运行的时候,随时可以从元数据中提取提取出这些附加信息,并以之决策程序的运行。

示例

比如我们写一个关于人的类Person,该类可以对人的属性以及某些行为(方法)进行描述。那么如果我们要对人类进行进一步描述呢?比如人这个类是属于动物的灵长类动物,有人会说我们可以为这个Person类去写一个灵长动物类的父类,再用

人类去继承这个类去解决。但是我们要求的是仅仅是描述性的,就是对这个人类进行进一步的描述,而在实际操作中不需要去操作。这样的情况我们就可以用特性的概念去解决,特性简而言之就是程序集的特定程序元素所具有的另外的性质。

//先定义一个人类Person类
        class Person
        {
            //人的姓名储存字段和属性 
            private string name;
            public string Name
            {
                set { name = value; }
                get { return name; }
            }

            //人的年龄储存字段和属性 
            private int age;
            public int Age
            {
                set { age = value; }
                get { return age; }
            }

            //人的性别储存字段和属性 
            private char sex;
            public char Sex
            {
                set { sex = value; }
                get { return sex; }
            }

            //人的打招呼方法 
            public void SayHello()
            {
                Console.WriteLine($"大家好,我叫{this.Name},我今年{this.Age}岁了,我的性别是{this.Sex}");
            }
        }

        //定义动物的特性类AnimalAttribute类继承于Attribute(特性)
        class AnimalAttribute : Attribute
        {
            //字段和属性描述是否是灵长类
            private bool isPrimate;
            public bool IsPrimate
            {
                set { isPrimate = value; }
                get { return isPrimate; }
            }
        }

对人类进行动物类描述。即在人类的定义前面加:
[Animal(IsPrimate = true)]  //为人类加特性,指定人类是灵长类。

技术分享图片

 下面我们就可以通过代码来获得人类的特性:

//声明特性对象,并通过Attribute类的静态方法GetCustomAttribute()获得人类的在动物类的特性,并赋值给特性对象 
            Attribute att1 = Attribute.GetCustomAttribute(typeof(Person), typeof(AnimalAttribute));

            //将特性对象转化为动物特性对象
            AnimalAttribute animalAtt = att1 as AnimalAttribute;

            //检查转化是否成功如果成功则打印这个特性对象的是否是灵长类的属性。
            if (animalAtt != null)
            {
                Console.WriteLine("人类是否是灵长类:{0}", animalAtt.IsPrimate);
            }
            Console.ReadKey(); 

注意:如果一个类有的某个特性类描述多次,则要用GetCustomAttributes()方法。

Attribute的使用方法:(四种方式完全等价)

 

//长记法
[ConditionalAttribute("Li")]
[ConditionalAttribute("NoBug")]
public static void Func()
{Console.WriteLine("Created by Li, NoBug"); }
//短记法
[Conditional("Li")]
[Conditional("NoBug")]
public static void Func()
{Console.WriteLine("Created by Li, NoBug"); }
//换序
[Conditional("NoBug")]
[Conditional("Li")]
public static void Func()
{Console.WriteLine("Created by Li, NoBug"); }
//单括号叠加
[Conditional("NoBug"),Conditional("Li")]
public static void Func()
{Console.WriteLine("Created by Li, NoBug"); } 

 

特殊的特性类

obsolete类用来指定该类的成员已经过时,在程序使用这个成员的时候会给出提示。

obsolete类的属性

obsolete类常用的有两个属性:第一个属性是提示文字,第二个属性是是否报错。

比如如果我们的Person类的SayHello()方法现在不能用了,不允许程序员使用这个方法,那么我们就可以在Person类的SayHello方法前面加[Obsolete("该方法已经过期,请找最新的方法", true)]

这样当我们在主程序中用到Person类的SayHello方法的时候程序就会报错。当然,如果第二个参数设置为false时,在调用该成员的时候不会报错,但是会报出警告。

技术分享图片

 

技术分享图片

 

 

 

 

 

原文链接:https://blog.csdn.net/qq_38507850/article/details/79181319

原文链接:https://blog.csdn.net/xiaouncle/article/details/70216951

C#的特性(Attribute)

原文:https://www.cnblogs.com/zhaoyl9/p/12027938.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!