【问题标题】:C# Attributes and Metadata implicationC# 属性和元数据含义
【发布时间】:2010-03-24 15:57:18
【问题描述】:

我从网上阅读了有关 C# 属性和元数据的教程。这很酷,但我想知道它的含义。

  1. 加载程序集时是否加载(自定义)属性?还是仅当您使用反射来检索元数据时?

  2. 似乎属性增加了总代码大小,因为它被编译到可执行文件中?是这样吗?

  3. 是否可以有编译时属性? IE。只有在定义了 DEBUG 时才会应用属性?

我知道这样做是这样的:

#if DEBUG
[MyCustomAttribute]
#endif

但我想知道是否有更好的方法?

  1. 在使用大量属性时是否有任何性能/内存警告?我的目标平台是 Xbox 360(使用 C#/XNA)。

谢谢!

-斯蒂芬纳斯

【问题讨论】:

    标签: c# performance attributes xna metadata


    【解决方案1】:

    属性有两部分,它们的代码以及它们的构造函数参数和属性数据。代码存储在程序集的 IL 中,数据存储在程序集元数据中。如果不使用某个属性,那只会占用一些虚拟内存空间,但不需要任何机器资源。

    在您使用 GetCustomAttributes() 方法之前,什么都不会发生。然后属性类的代码得到即时编译,就像你程序集中的常规代码一样。并且使用元数据中的属性数据调用构造函数和属性设置器。当内存管理器映射 IL、机器代码和元数据页面时,您将占用一些 RAM。

    【讨论】:

      【解决方案2】:

      1) AFAIK 属性是惰性实例化的,但它们随程序集一起进入内存。
      2)任何地方都不足以担心。高德纳等
      3) 是的。

      使用属性意味着使用反射,这是您在框架中可以做的一些最慢的事情之一。但是,对于您的应用程序来说,它是否太慢了?不知道你在做什么,更不用说你需要在几毫秒内做什么,没有人可以给你一个是或否的答案。

      最好的办法是制作一个原型,看看 IRL 是什么样的。再次,Knuth 等。

      【讨论】:

        【解决方案3】:
        1. 加载程序集时加载属性。它们是类型信息的一部分,因此会自动加载类型。
        2. 在带有属性的程序集大小方面存在(非常小的)成本。不过,这非常轻微,我不会担心。
        3. 您可以这样做,但只能以您展示的方式进行。
        4. 拥有属性不会影响性能。除非使用反射显式查询属性,否则它们在运行时会被忽略。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-28
          • 1970-01-01
          相关资源
          最近更新 更多