C# 特性学习

特性释义

C#特性是指我们可以对类、以及C#程序集中的成员进行进一步的描述,比如我们写一个关于人的类Person,该类可以对人的属性以及某些行为(方法)进行描述。那么如果我们要对人类进行进一步描述呢,比如人这个类是属于动物的灵长类动物。有人会说我们可以为这个Person类去写一个灵长动物类的父类,再用人类去继承这个类去解决。但是我们要求的是仅仅是描述性的,就是对这个人类进行进一步的描述,而在实际操作中不需要去操作。

属性特性区分:

属性(Property):属性是面向对象思想里所说的封装在类里面的数据字段,Get,Set方法。

特性(Attribute): 官方解释:特性是给指定的某一声明的一则附加的声明性信息。 允许类似关键字的描述声明。它对程序中的元素进行标注,如类型、字段、方法、属性等。从.net角度看,特性是一种 类,这些类继承于System.Attribute类,用于对类、属性、方法、事件等进行描述,主要用在反射中。但从面向对象的级别看,其实Attribute是类型级别的,而不是对象级别。

特性与注释的区别

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

Attribute是程序代码的一部分,它不但不会被编译器丢弃,而且还会被编译器编译进程序集(Assembly)的元数据(Metadata)里。在程序运行的时候,随时可以从元数据(元数据:.NET中元数据是指程序集中的命名空间、类、方法、属性等信息,这些信息是可以通过Reflection读取出来的。)中提取提取出这些附加信息,并以之决策程序的运行。

概述

特性本质上是用来给代码添加额外信息的一种手段,它可以应用于类、结构、方法、构造函数等。在 C# 中,特性是继承自 Attribute 基类的类。所有继承自 Attribute 的类都可以用作给代码添加额外信息。

.Net 框架提供了三种预定义特性:AttributeUsage、Conditional、Obsolete。

声明特性和声明其他类是一样的,只是所有的特性都派生自System.Attribute。根据约定,所有特性名称都以单词“Attribute”结束,以便将它们与“.NET Framework”中的其他项区分。

使用特性

例如,有一个名为 ObsoleteAttribute 的特性。 它用于示意代码已过时,不再使用。 可以使用方括号将此特性应用于某个类或者其他。

[Obsolete]
public class TestClass
{
}

虽然此特性类的名称为 ObsoleteAttribute,但只需在代码中使用 Obsolete。 这是 C# 得一项约定。虽然也可以使用全名 ObsoleteAttribute。

将类标记为已过时时还可以通过将参数传递给 Obsolete 特性额外添加一些说明,只能传递bool, int, double, string, Type, enums, etc和这些类型的数组。 不能使用表达式或变量。

[Obsolete("TestClass已经过时,请使用NewTestClass")]
public class TestClass
{
}

自定义特性

自定义特性只需要让一个类继承Attribute类并且名称后缀是Attribute结尾即可。

class MsgAttribute : Attribute
{
    private string msg;
    public MyAttribute(string msg)
    {
        this.msg = msg;
    }
    public void ShowMsg()
    {
        Console.WriteLine(msg);
    }
}

[Msg("这是一条信息")]
class MyClass
{
}

读取特性信息

特性只做标识所用。不借助一些外在力量,特性其实什么用也没有。

若要使用特性,通常需要使用反射。例如,可以使用反射获取类的相关信息。

TypeInfo typeInfo = typeof(MyClass).GetTypeInfo();//获取类型信息
MsgAttribute customAttribute = typeInfo.GetCustomAttribute<MsgAttribute>(); //获取特性信息,返回特性的实例对象
customAttribute.GetName();//调用方法 控制台中输出 这是一条信息

GetCustomAttribute泛型方法用于获取某个特定的特性,返回该特性实例,还有一个GetCustomAttributes()方法用于获取所有的特性。

特性只有使用 GetCustomAttribute 或 GetCustomAttributes,它们才会实例化。 并且每次调用都会重新实例化并返回不同的特性实例。

预定义特性

.Net 框架提供了三种预定义特性:AttributeUsage、Conditional、Obsolete。

AttributeUsage
AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。
语法:

[AttributeUsage(    validon,    AllowMultiple=allowmultiple,    Inherited=inherited )] 

参数说明:

  • validon: 规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All。

  • allowmultiple:可选的参数,为该特性的 AllowMultiple 属性(property)提供一个布尔值。如果为 true,则该特性是多用的。默认值是 false(单用的)。

  • inherited:可选的参数,为该特性的 Inherited 属性(property)提供一个布尔值。如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。

    示例:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property,  AllowMultiple = true)]

总结

特性可以提供声明能力,但它们是一种元数据形式的代码,本身并不执行操作。

特性是一种允许我们向程序的程序集添加元数据的语言结构,它是用于保存程序结构信息的某种特殊类型的类。

可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。

MSDN解释为:特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。特性与程序实体关联后,即可在运行时使用名为“反射”的技术查询特性。

特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。

从哪里抄写

echozly:C# 特性(Attribute)介绍
C#-特性(Attribute)C#-特性(Attribute)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值