【问题标题】:ConditionalAttribute and other special classesConditionalAttribute 和其他特殊类
【发布时间】:2011-09-16 03:48:56
【问题描述】:

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

我想知道编译器或语言使用了哪些其他类我们无法自己编写代码。

【问题讨论】:

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


    【解决方案1】:

    除了那些提到的;

    AttributeUsageAttribute
    

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

    ObsoleteAttribute
    

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

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

    【讨论】:

    • 好点,如果您也愿意编写自己的 C# 编译器,您可以自己实现所有这些特殊情况 :)
    • @Matt - 不,您不需要编写编译器。您使用现有的编译器,但使用 /nostdlib 告诉它不要使用 mscorlib.dll,并按照 ECMA335 中的定义提供您自己的编译器(包括已发布的强名称签名等)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      [SerializableAttribute] 浮现在脑海中。编译器对其他属性的处理方式不同,我相信它已被转换为 IL 中的特定指令..

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

      .class public auto ansi serializable beforefieldinit ArgumentException
      

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

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

      【讨论】:

      • 啊,有趣。我打折那个,因为我认为我们可以编写那个代码,因为它只被其他类使用。
      猜你喜欢
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2015-04-24
      • 2014-02-01
      相关资源
      最近更新 更多