过时属性(ObsoleteAttribute)是如何工作的?

4
新手问题:除非我弄错了,大多数属性似乎都是无害的,直到你在程序集或类上使用运行时反射来发现属性并对其进行操作。我注意到ObsoleteAttribute在.NET属性中似乎是独一无二的,因为它可以在编译期间动态地引发警告和错误:
    [Obsolete("don't use", false)]  
    public string Name { get; set; }

我想知道它是如何实现的?这是编译器内置的功能吗,因为相关的警告信息编号似乎特定于ObsoleteAttribute?我已经谷歌过了,但没有找到明显的答案。我知道在C++中,通过巧妙的宏技巧可以让C++按需发出警告和错误,但C#是如何实现的呢?谢谢...


1
请参考此问题和答案,了解其他特殊的、编译器感知的属性示例:ConditionalAttribute 和其他特殊类 - George Duckett
3个回答

7

是的,编译器知道ObsoleteAttribute - 它甚至在C# 4语言规范的17.4.3节中列出。

(编译器还需要知道AttributeUsageAttributeConditionalAttribute,并且MS编译器知道IndexerNameAttributeSystem.Runtime.InteropServices内的一些其他属性。)


那么实现不一定是用C#吗?我的下一个问题是:“如何在我的代码中动态生成错误或警告?” - 本质上,我只想知道是否可以由用户在现有的C#中编写此类内容,而不必诉诸于像Roslyn CTP这样的新东西。 - Barry
@Barry:生成错误/警告的位于编译器中,无论你使用哪种实现。至于你想要实现什么...这取决于你所说的“动态”是什么意思。你是否知道#error#warning预处理指令? - Jon Skeet
谢谢 - 是的,我知道关于编译指示的事情,作为一个C++背景的人,我已经学会了讨厌任何以'#'开头并与预处理器相关的代码 :) 我实际上并不想编写代码,只是满足我的好奇心,看看ObsoleteAttribute是否使用了在C#中直接可用的功能。 - Barry
1
@Barry:ObsoleteAttribute 中并没有任何代码,而是 C# 编译器以特殊的方式了解它。 - Jon Skeet

2

你说的没错,这个属性的识别和解释已经内置于编译器中了。


1

正如Skeet所指出的那样,编译器意识到了ObsoleteAttribute,这并不是唯一的一个,还可以看看ConditionalAttribute。


1
请参考此问题和答案,了解其他特殊的、编译器感知的属性示例:ConditionalAttribute 和其他特殊类 - George Duckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接