- 特性:特性本质上是一个类 , 用来为目标元素提供附加信息 , 并在运行时通过反射机制来获取这些信息以影响或控制应用程序运行时的行为 。目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性、返回值、结构或其他特性 。
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://shimg.jingyanzongjie.com/230724/1516292316-83.png)
文章插图
此处仅展示部分 , 派生的类有很多 , 每个类之下有不同的内容 , 其内容用于规定被修饰的对象应当怎样做或只能怎样做 。如:AttributeUsage(AttributeTargets.Method)。其中 , AttributeTargets 用于指定对哪些程序元素使用;而 AttributeTargets.Method 表示被修饰的对象只能被方法体使用 。
在 .NET 中 , 提供了三种预定义的特性:AttributeUsage、Conditional 与 Obsolete 。
- AttributeUsage:描述了如何使用一个自定义特性类 。
- Conditional:标记了一个条件方法 , 其执行依赖于指定的预处理标识符 。它会引起方法调用的条件编译 , 取决于指定的值 , 比如 Debug 或 Trace 。
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://shimg.jingyanzongjie.com/230724/1516294122-84.png)
文章插图
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://shimg.jingyanzongjie.com/230724/1516294027-85.png)
文章插图
如 , 我们在方法上附加一个 Conditional 特性 , 使得其只在 DEGUB 模式下运行 。
- Obsolete:用于标记不应被使用的程序实体 。它可以让通知编译器丢弃某个特定的目标元素 。如 , 当一个新方法被用在一个类中 , 但是仍然想要保留类中的旧方法 , 可以把它标记为 Obsolete(过时的)并输出输出信息 。
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://shimg.jingyanzongjie.com/230724/1516295923-86.png)
文章插图
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://shimg.jingyanzongjie.com/230724/1516294961-87.png)
文章插图
2. 类 IntrinsicAttribute关于特性 Intrinsic , 在 dotnet/corefx 中找到其相关注释如下:
![.NET源码学习 [算法2-数组与字符串的查找与匹配]](http://shimg.jingyanzongjie.com/230724/1516293095-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. 微软翻译:运行时/编译器可能会专门处理使用此属性标记的类型 。也就是说 , 被该内在属性标记的对象确实会进行专门的处理 。
下面 , 简单解释一下其运行流程:
经验总结扩展阅读
- 【前端必会】不知道webpack插件? webpack插件源码分析BannerPlugin
- 如何开展学习十八大,提高了教育的质量
- 十岁小孩学习不太好跟家长又不会怎么教他呢
- 20220929-ArrayList扩容机制源码分析
- 高效上课学习方法
- 怎么做一个学习的人
- Optional源码解析与实践
- Go 源码解读|如何用好 errors 库的 errors.Is 与 errors.As() 方法
- .Net下的分布式唯一ID
- .NET 反向代理 YARP 代理 GRPC
