ConditionalAttribute和其他特殊类

时间:2011-06-16 07:54:55

标签: c# compiler-construction attributes language-features

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

我想知道编译器或语言使用的其他类是什么,我们无法自己编码。

3 个答案:

答案 0 :(得分:6)

除了提到的那些;

AttributeUsageAttribute

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

ObsoleteAttribute

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

我想到了[SerializableAttribute]。编译器对其他属性的处理方式不同,我相信它已转换为IL中的特定指令。

编辑以IL for ArgumentException为例,类定义如下所示:

.class public auto ansi serializable beforefieldinit ArgumentException

请注意*'serializable'修饰符。通常使用一个属性,您可能会看到类似下面的内容,但它不存在:

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