[# 有关Intrinsic、Attribute与“内在属性”]
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S2192014-81.png)
文章插图
[Intrinsic] 被称为内在属性,我们把形如 [xxxx] 的表达式称为内在属性,如 [Serializable]、[IndexerName("Chars")]、[MethodImpl(MethodImplOptions.InternalCall)]等 。
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S21920N-82.png)
文章插图
通过追踪发现其派生于类Attribute 。在分析该内在属性前,先来看看什么是 Attribute 。
1. 类 Attritube这里要注意,属性和特性的区别 。在微软翻译器上,Arrtibute 被翻译为属性,这个翻译在 C# 中并不准确 。
- 属性:又叫智能字段,是类的成员,是面向对象编程语言的一个基本概念 , 提供了安全和灵活的数据访问封装,不存储数据 。
- 特性:特性本质上是一个类,用来为目标元素提供附加信息 , 并在运行时通过反射机制来获取这些信息以影响或控制应用程序运行时的行为 。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性、返回值、结构或其他特性 。
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S2193a2-83.png)
文章插图
此处仅展示部分,派生的类有很多 , 每个类之下有不同的内容,其内容用于规定被修饰的对象应当怎样做或只能怎样做 。如:AttributeUsage(AttributeTargets.Method)。其中,AttributeTargets 用于指定对哪些程序元素使用;而 AttributeTargets.Method 表示被修饰的对象只能被方法体使用 。
在 .NET 中,提供了三种预定义的特性:AttributeUsage、Conditional 与 Obsolete 。
- AttributeUsage:描述了如何使用一个自定义特性类 。
- Conditional:标记了一个条件方法,其执行依赖于指定的预处理标识符 。它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace 。
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S21a012-84.png)
文章插图
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S2191415-85.png)
文章插图
如,我们在方法上附加一个 Conditional 特性,使得其只在 DEGUB 模式下运行 。
- Obsolete:用于标记不应被使用的程序实体 。它可以让通知编译器丢弃某个特定的目标元素 。如,当一个新方法被用在一个类中,但是仍然想要保留类中的旧方法,可以把它标记为 Obsolete(过时的)并输出输出信息 。
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S2196013-86.png)
文章插图
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S2191440-87.png)
文章插图
2. 类 IntrinsicAttribute关于特性 Intrinsic,在 dotnet/corefx 中找到其相关注释如下:
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://img.zhejianglong.com/231017/1S21a1T-88.png)
文章插图
- Calls to methods or references to fields marked with this attribute may be replaced at ome call sites with jit intrinsic expansions. 微软翻译:某些调用站点中,对使用此属性标记的方法的调用或对使用此属性标记的字段的引用可能会替换为 JIT扩展 。说人话就是,被该属性标记的方法或字段 , 可能会被 JIT 替换/优化成功能相同的方法或字段 。
- Types marked with this attribute may be specially treated by the runtime/compiler. 微软翻译:运行时/编译器可能会专门处理使用此属性标记的类型 。也就是说,被该内在属性标记的对象确实会进行专门的处理 。
下面 , 简单解释一下其运行流程: