• C# 中的特性 Attribute


    Attribute 一般译作“特性”,Property 仍然译为“属性”。

      1. Attribute 是什么

      Attribute 是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。

      简单的说,Attribute就是一种“附着物” —— 就像牡蛎吸附在船底或礁石上一样。

      这些附着物的作用是为它们的附着体追加上一些额外的信息(这些信息就保存在附着物的体内)—— 比如“这个类是我写的”或者“这个函数以前出过问题”等等。

      2. Attribute 的作用

      特性Attribute 的作用是添加元数据
      元数据可以被工具支持,比如:编译器用元数据来辅助编译,调试器用元数据来调试程序。

      3. Attribute 与注释的区别

      • 注释是对程序源代码的一种说明,主要目的是给人看的,在程序被编译的时候会被编译器所丢弃,因此,它丝毫不会影响到程序的执行。
      • 而Attribute是程序代码的一部分,不但不会被编译器丢弃,而且还会被编译器编译进程序集(Assembly)的元数据(Metadata)里,在程序运行的时候,你随时可以从元数据里提取出这些附加信息来决策程序的运行

    Attribute 的本质

    莫非使用了Attribute 就相当于定义了新的修饰符(Modifier)吗?让我们来一窥究竟!示例代码如下:

    #define XG //C# 的宏定义必须出现在所有代码之前
    using System;
    using System.Diagnostics; // 注意:这是为了使用包含在此名称空间中的ConditionalAttribute 特性
    namespace Con_Attribute
    {
        class Program2
        {
            [Conditional("XG")]
            static void Fun()
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("http://xugang.cnblogs.com");
            }
            static void Main(string[] args)
            {
                Fun();
            }
        }
    }

    使用微软的中间语言反编译器查看 MSIL 中间语言中TargetMethod:void() 方法的代码,截图如下:

      可以看出:Attribute 本质上就是一个类,它在所附着的目标对象上最终实例化。

      仔细观察中间语言(MSIL)的代码之后,那些被C# 语言所掩盖的事实,在中间语言(MSIL)中就变得赤身裸体了。而Attribute 也变得毫无秘密!

      图中红色所指的是Fun 方法及其修饰符,但Attribute 并没有出现在这里。

      图中蓝色所指的是在调用mscorlib.dll 程序集中System.Diagnostics 名称空间中ConditionalAttribute 类的构造函数。

      可见,Attribute 并不是修饰符,而是一个有着独特实例化形式的类!

      Attribute 实例化有什么独特之处呢?

      1.  它的实例是使用.custom 声明的。查看中间语言语法,你会发现.custom 是专门用来声明自定义特性的。

      2.  声明Attribute 的位置是在函数体内的真正代码(IL_0000  至IL_0014 )之前。

      这就从“底层”证明了Attribute不是什么“修饰符”,而是一种实例化方式比较特殊的类。

      元数据的作用

      MSIL 中间语言中,程序集的元数据(Metadata)记录了这个程序集里有多少个namespace、多少个类、类里有什么成员、成员的访问级别是什么。而且,元数据是以文本(也就是Unicode 字符)形式存在的,使用.NET的反射(Reflection)技术就能把它们读取出来,并形成MSIL 中的树状图、VS 里的Object  Browser 视图,以及自动代码提示功能,这些都是元数据与反射技术结合的产物。一个程序集(.EXE或.DLL)能够使用包含在自己体内的元数据来完整地说明自己,而不必像C/C++ 那样带着一大捆头文件,这就叫作“自包含性”或“自描述性”。

    *****************************************************
    *** No matter how far you go, looking back is also necessary. ***
    *****************************************************
  • 相关阅读:
    怎样做一个合格的程序猿
    error: No resource identifier found for attribute 'format24Hour' in package 'android'
    【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第五步)(4)
    Length of last word--LeetCode
    SmartController智能控制系统
    湘潭-1203-A simple problem
    android中检測网络连接状态简单总结
    AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的差别
    please set a system env PAODING_DIC_HOME or Config paoding.dic.home in paoding-dic-home.properties p
    与IBM的Lin Sun关于Istio 1.0和微服务的问答
  • 原文地址:https://www.cnblogs.com/gangle/p/9238449.html
Copyright © 2020-2023  润新知