特性释义
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)