.NET源码学习 [算法2-数组与字符串的查找与匹配](15)

  • 特性:特性本质上是一个类 , 用来为目标元素提供附加信息 , 并在运行时通过反射机制来获取这些信息以影响或控制应用程序运行时的行为 。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性、返回值、结构或其他特性 。
限于篇幅 , 在此就简单描述一下这个类的基本信息与功能 。一般地 , 我们并不直接使用这个类 , 而是较多的使用其派生出的类
.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
此处仅展示部分 , 派生的类有很多 , 每个类之下有不同的内容 , 其内容用于规定被修饰的对象应当怎样做或只能怎样做 。如:AttributeUsage(AttributeTargets.Method)。其中 , AttributeTargets 用于指定对哪些程序元素使用;而 AttributeTargets.Method 表示被修饰的对象只能被方法体使用 。
在 .NET 中 , 提供了三种预定义的特性:AttributeUsage、Conditional 与 Obsolete 。
  • AttributeUsage:描述了如何使用一个自定义特性类 。
  • Conditional:标记了一个条件方法 , 其执行依赖于指定的预处理标识符 。它会引起方法调用的条件编译 , 取决于指定的值 , 比如 Debug 或 Trace 。

.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图

.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
如 , 我们在方法上附加一个 Conditional 特性 , 使得其只在 DEGUB 模式下运行 。
  • Obsolete:用于标记不应被使用的程序实体 。它可以让通知编译器丢弃某个特定的目标元素 。如 , 当一个新方法被用在一个类中 , 但是仍然想要保留类中的旧方法 , 可以把它标记为 Obsolete(过时的)并输出输出信息 。

.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图

.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
2. 类 IntrinsicAttribute关于特性 Intrinsic , 在 dotnet/corefx 中找到其相关注释如下:
.NET源码学习 [算法2-数组与字符串的查找与匹配]

文章插图
  • 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. 微软翻译:运行时/编译器可能会专门处理使用此属性标记的类型 。也就是说 , 被该内在属性标记的对象确实会进行专门的处理 。
举个粗略的例子:JIT-optimizer 可以代替 Enum.HasFlag 在某些情况下进行简单的按位比较 , 而在其他情况下则不然 。为此 , 它需要将方法标识为 Enum.HasFlag  , 检查一些条件并将其替换为更优化的实现 。虽然优化器可以通过名称识别方法 , 但出于性能原因 , 最好在执行字符串比较之前通过简单的标志过滤掉方法 , 即在编译阶段就将要优化的部分识别出来 , 而不是将其交给优化器来进行识别工作 。
下面 , 简单解释一下其运行流程:

经验总结扩展阅读