【问题标题】:C# Attributes and Metadata implicationC# 属性和元数据含义
【发布时间】:2010-03-24 15:57:18
【问题描述】:
我从网上阅读了有关 C# 属性和元数据的教程。这很酷,但我想知道它的含义。
加载程序集时是否加载(自定义)属性?还是仅当您使用反射来检索元数据时?
似乎属性增加了总代码大小,因为它被编译到可执行文件中?是这样吗?
是否可以有编译时属性? IE。只有在定义了 DEBUG 时才会应用属性?
我知道这样做是这样的:
#if DEBUG
[MyCustomAttribute]
#endif
但我想知道是否有更好的方法?
- 在使用大量属性时是否有任何性能/内存警告?我的目标平台是 Xbox 360(使用 C#/XNA)。
谢谢!
-斯蒂芬纳斯
【问题讨论】:
标签:
c#
performance
attributes
xna
metadata
【解决方案1】:
属性有两部分,它们的代码以及它们的构造函数参数和属性数据。代码存储在程序集的 IL 中,数据存储在程序集元数据中。如果不使用某个属性,那只会占用一些虚拟内存空间,但不需要任何机器资源。
在您使用 GetCustomAttributes() 方法之前,什么都不会发生。然后属性类的代码得到即时编译,就像你程序集中的常规代码一样。并且使用元数据中的属性数据调用构造函数和属性设置器。当内存管理器映射 IL、机器代码和元数据页面时,您将占用一些 RAM。
【解决方案2】:
1) AFAIK 属性是惰性实例化的,但它们随程序集一起进入内存。
2)任何地方都不足以担心。高德纳等
3) 是的。
使用属性意味着使用反射,这是您在框架中可以做的一些最慢的事情之一。但是,对于您的应用程序来说,它是否太慢了?不知道你在做什么,更不用说你需要在几毫秒内做什么,没有人可以给你一个是或否的答案。
最好的办法是制作一个原型,看看 IRL 是什么样的。再次,Knuth 等。
【解决方案3】:
- 加载程序集时加载属性。它们是类型信息的一部分,因此会自动加载类型。
- 在带有属性的程序集大小方面存在(非常小的)成本。不过,这非常轻微,我不会担心。
- 您可以这样做,但只能以您展示的方式进行。
- 拥有属性不会影响性能。除非使用反射显式查询属性,否则它们在运行时会被忽略。