• 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. ***
    *****************************************************
  • 相关阅读:
    【前端进阶】VUE高性能组件引用
    「前端进阶」高性能渲染十万条数据(虚拟列表) (自己修改版本)
    页面缓存、离线存储技术localforage(案例篇)
    页面缓存、离线存储技术localforage(介绍篇)
    websocket快速搭建(node+websocket)
    一款程序员的杀手级应用:TabNine代码补全工具
    如何把es6的代码转成es5,ECMAScript 2015+代码转换神器——Babel
    如何使用echarts画一个简单k线图
    深入浅出理解 . 深拷贝 . 浅拷贝
    JS高级一看就懂什么是原型链
  • 原文地址:https://www.cnblogs.com/gangle/p/9238449.html
Copyright © 2020-2023  润新知