这种.Net(C#)属性的使用是否昂贵?

我想知道.Net中属性的使用,特别是C#是否昂贵,为什么或为什么不呢?

我特别询问C#,除非不同的.Net语言之间没有区别(因为基类库是相同的?)。

所有较新的.Net技术都广泛使用属性,例如Linq to SQL,ASP.Net MVC,WCF,企业库等,我想知道这会对性能产生什么影响。 很多类都会使用某些属性自动修饰,或者某些function/特性需要这些属性。

费用问题是否取决于具体实施细节? 如何将属性编译为IL? 它们是自动缓存还是由实现者决定?

“属性的使用”太模糊了。 获取属性是一种有效的reflection操作 – 您不希望在循环中定期执行 – 但是包含在元数据中并不昂贵,而典型的使用模式(IMO)是构建一些其他表示(例如,读取属性一次后的内存中架构。

可能有一些缓存涉及,但我可能会缓存其他表示。 例如,如果我用描述来装饰枚举值,我通常会获取属性一次以构建字符串到枚举字典(反之亦然)。

这取决于您如何使用它们…某些属性仅用于信息目的(例如ObsoleteAttribute),因此它们对运行时性能没有任何影响。 其他属性由编译器(如DllImportAttribute)或后编译器(如PostSharp)使用,因此成本是在编译时,而不是运行时。 但是,如果在运行时使用reflection来检查属性,则可能会很昂贵。