C# 中的特性 Attribute
2021-04-01 11:25
标签:蓝色 图片 sem for 级别 namespace mes 一个 微软 Attribute 一般译作“特性”,Property 仍然译为“属性”。 1. Attribute 是什么 Attribute 是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。 简单的说,Attribute就是一种“附着物” —— 就像牡蛎吸附在船底或礁石上一样。 这些附着物的作用是为它们的附着体追加上一些额外的信息(这些信息就保存在附着物的体内)—— 比如“这个类是我写的”或者“这个函数以前出过问题”等等。 2. Attribute 的作用 特性Attribute 的作用是添加元数据。 3. Attribute 与注释的区别 莫非使用了Attribute 就相当于定义了新的修饰符(Modifier)吗?让我们来一窥究竟!示例代码如下: 使用微软的中间语言反编译器查看 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++ 那样带着一大捆头文件,这就叫作“自包含性”或“自描述性”。 C# 中的特性 Attribute 标签:蓝色 图片 sem for 级别 namespace mes 一个 微软 原文地址:https://www.cnblogs.com/gangle/p/9238449.html
元数据可以被工具支持,比如:编译器用元数据来辅助编译,调试器用元数据来调试程序。
Attribute 的本质
#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();
}
}
}
*****************************************************
*** No matter how far you go, looking back is also necessary. ***
*****************************************************