ConditionalAttribute和其他特殊类

本文关键字:其他 ConditionalAttribute | 更新日期: 2023-09-27 17:59:28

ConditionalAttribute可用于根据定义的编译器符号删除对标记方法的调用。我假设我们不能自己创建这个类,因为编译器必须专门查找它。

我想知道编译器或语言还使用了哪些我们自己无法编码的类。

ConditionalAttribute和其他特殊类

除上述内容外;

AttributeUsageAttribute

具有特殊的编译器支持,因为它限制了(在编译时)如何应用属性

ObsoleteAttribute

也被编译器用来警告或错误使用。

不过,我怀疑,从技术上讲,只要你写自己的核心库和System.dll,你就可以自己写所有这些;p编译器通常会寻找模式/签名,因为它必须满足不同的运行时需求——实际上,您不必使用MS核心库。然而,行为是由编译器定义的,而不是由类定义的,所以你不能让它做任何不同的事情。

  • 编译器查找[ExtensionAttribute]以指示扩展方法(以及包含扩展方法的类)。

  • [DynamicAttribute]用于指示成员应被视为类型dynamic(即使成员类型本身只是object

  • [InternalsVisibleTo]允许一个程序集访问另一个程序集中的内部成员。

基本上查看System.Runtime.CompilerServices命名空间,并检查其中的属性。。。其中许多将由编译器专门处理,即使它不是C#编译器(例如,据我所知,C#编译器没有使用DateTimeConstantAttribute,但使用了DecimalConstantAttribute有可能C#编译器会消耗常量DateTime值,即使它不会生成这些值…)

[SerializableAttribute]跃然纸上。编译器处理这一点的方式与其他属性不同,我相信它被翻译成IL中的特定指令。

EDIT以ArgumentException的IL为例,类定义如下:

.class public auto ansi serializable beforefieldinit ArgumentException

注意*'serializable'修饰符。通常有一个属性,你会期望看到以下内容,但它并不存在:

.custom instance void System.SerializableAttribute::.ctor() = (