博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 中的特性 Attribute
阅读量:4568 次
发布时间:2019-06-08

本文共 2066 字,大约阅读时间需要 6 分钟。

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. ***
*****************************************************

转载于:https://www.cnblogs.com/gangle/p/9238449.html

你可能感兴趣的文章
爬取音悦台MV信息(requests,BeautifulSoup,xlwt)----待完善
查看>>
asp.net gridview 控件如何根据一列内容显示另一列的内容
查看>>
应用开发之Linq和EF
查看>>
EF架构~终于自己架构了一个相对完整的EF方案
查看>>
js-位置问题
查看>>
c语言实践 给三个数输出最大的那个数
查看>>
线性表
查看>>
Entity Framework学习过程
查看>>
VSCode 快捷键
查看>>
Visual Studio(VS)秘钥集合
查看>>
三级菜单(高大上版)
查看>>
jar包冲突解决方法
查看>>
PPT1 例1
查看>>
java对象 深度克隆(不实现Cloneable接口)和浅度克隆
查看>>
[整理] ES5 词法约定文档树状图
查看>>
处女座和小姐姐(三)(数位dp模板)
查看>>
【脚本程序】Openssl利用脚本
查看>>
小波分析及其应用
查看>>
dynamic memory allocate
查看>>
分块算法
查看>>