C# 特性 Attribute

家住魔仙堡 提交于 2020-01-14 16:05:58

https://www.runoob.com/csharp/csharp-attribute.html

理解:

特性就是一个标签,可以给程序中的元素添加一些信息,在程序运行时就可以访问元素的这些信息,程序就可以通过这些信息进行其他操作。当然特性在编译期就存在了,所有编译器也可以通过这些特性信息进行条件编译。

1、定义:
    (1)    特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。
    (2)    是一个标签,用于传递元素的信息。
    (3)    元素:类、方法、结构、枚举、组件等。

2、内容:
    (1)    通过放置在它所应用的元素前面的方括号([ ])来描述的。
    (2)    特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。
    (3)    .Net 框架提供了两种类型的特性:预定义特性和自定义特性。

3、语法:
    (1)     语法规则:

[attribute(positional_parameters, name_parameter = value, ...)]  
element 

    (2)    特性(Attribute)的名称和值是在方括号内规定的,放置在它所应用的元素之前。

positional_parameters 规定必需的信息;
name_parameter 规定可选的信息。


4、预定义特性:
    (1)    .Net 框架提供了三种预定义特性:AttributeUsage、Conditional、Obsolete。
    (2)    AttributeUsage
        01. 描述了如何使用一个自定义特性类。它规定了特性应用范围。
        02. 语法:

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

参数:
validon 规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All。
allowmultiple(可选的),如果为 true,则该特性是多用的。默认值是 false(单用的)。
inherited(可选的),如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。
        03. 例如:

[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)] 

    (3)    Conditional
        01. 标记方法为条件方法,表示方法的执行依赖于指定的预处理标识符。
        02. 它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。突破#define,#undefine,#if,#endif的限制,而且更加灵活。
        03. 语法如下:

[Conditional(conditionalSymbol)]

        04. 例如:

[Conditional("DEBUG")] //只在DEBUG下编译执行,Release下不编译不执行

    (4)    Obsolete
        01. 这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。
       02. 语法如下:

[Obsolete(message)]
[Obsolete(message, iserror)]

参数:message,描述具体信息,如项目为什么过时以及该替代使用什么。
Iserror,如果该值为true,编译器则把该项目的使用当作一个错误。默认值是 false(编译器则只会生成一个警告)。

 
5、自定义特性
    (1)    特性也是一个类,可以创建自定义特性类,用来给元素添加信息,在运行中可以被访问。
    (2)    所有特性类都派生自标准库提供的 Attribute 基类。
    (2)    创建和使用的步骤:
        01. 声明:声明自定义特性;
        02. 定义:构建自定义特性;
        03. 应用:在目标程序元素上应用特性;
        04. 访问:通过反射访问特性。
    (3)    声明:
声明自定义特性类:使用AttributeUsage特性标记,并继承System.Attribute 类。
    (4)    定义:
定义特性类的具体内容,存储特性的具体内容。
每个特性必须至少有一个构造函数。必需的定位参数(positional)应通过构造函数传递。
    (5)    访问:
        01. 使用反射Reflection来访问特性attribute的信息。
        02. 例如:

System.Reflection.MemberInfo info = typeof(MyClass);  
object[] attributes = info.GetCustomAttributes(true);  
for (int i = 0; i < attributes.Length; i++)  
{  
    System.Console.WriteLine(attributes[i]);  
} 

  (6)  特殊运用:如果特性的名称以 Attribute 结尾,那么可以在引用特性时省略这部分名称。
        例如,可按如下方法使用 HelpAttribute。

[Help("xxx")]
public class Widget
{
    [Help("xxx", Topic = "xxx")]
    public void Display(string text)
    {
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!