【问题标题】:When are Attribute instances created?什么时候创建属性实例?
【发布时间】:2012-08-30 12:16:01
【问题描述】:

属性是否与应用它们的类的实例同时实例化?

【问题讨论】:

    标签: .net attributes


    【解决方案1】:

    在调用Type.GetCustomAttributes() 时加载属性。如果只是实例化类,甚至获取类型,属性还没有加载。

    看这个例子:

    class Program
    {
        static void Main()
        {
            Console.WriteLine("Calling AttributeLoadTest.TestStatic():");
            AttributeLoadTest.TestStatic();
            Console.WriteLine("Loading class");
            var x = new AttributeLoadTest();
            Console.WriteLine("Loading type..");
            var t = typeof (AttributeLoadTest);
            Console.WriteLine("Calling GetCustomAttributes()");
            var ats = t.GetCustomAttributes(false);
        }
    }
    
    [ConsoleTest]
    class AttributeLoadTest
    {
        public static void TestStatic()
        {
    
        }
    }
    
    [AttributeUsage(AttributeTargets.Class)]
    class ConsoleTestAttribute : Attribute
    {
        public ConsoleTestAttribute()
        {
            Console.WriteLine("ConsoleTestAttribute Constructor");
        }
    }
    

    打印出来:

    调用 AttributeLoadTest.TestStatic():

    加载类

    加载类型..

    调用 GetCustomAttributes()

    ConsoleTestAttribute 构造函数

    所以调用静态方法,实例化类,获取类型,并没有实例化属性。调用GetCustomAttributes() 即可。

    【讨论】:

    • 我自己也遇到过这种行为,想知道这背后的原因是什么?为什么类型的属性不像其他类型的对象图那样预加载?
    • @Martaver,延迟加载是软件开发中非常常见的做法。在你需要它们之前不加载东西通常更有效。如果您通常不需要它们,它总是更有效。
    • @SamualNeff 感谢您的回复,我理解延迟加载的目的,但我实际上更感兴趣的是为什么属性需要延迟加载,而不是与父类型同时加载.经过一番挖掘,我在这里找到了答案:stackoverflow.com/a/417302/535930
    • 这是真的吗?在运行时间开始之前或之后,属性是否未绑定到类型?我是 .net 的新手,但是我注意到在我的代码中插入断点后,我发现我定义的自定义属性类在我的任何测试代码被执行之前就被实例化了。
    • @Stewart,这是真的,我没有伪造控制台输出。 :-) 我现在重新检查了它,因为这篇文章已经有几年了,并且在 .NET 4.0 上得到了相同的结果。
    【解决方案2】:

    没有。属性绑定到类型,因此在加载类型时实例化。

    【讨论】:

    • 类型已加载,而不是实例?
    • 不,加载类型时不加载属性。在真正需要它们之前不会加载它们。
    • 奇怪。感谢您的测试。现在我想知道(i)GetCustomAttributes 是否在每次调用时都会生成新的属性对象,以及(ii)是否更早地加载了属性类。
    • @JohnB,每次调用GetCustomAttributes()都会创建一个新实例。
    • 感谢您进行这项非常有趣的研究。
    猜你喜欢
    • 2019-06-13
    • 2018-03-02
    • 1970-01-01
    • 2014-09-14
    • 2010-11-08
    • 2011-05-31
    • 1970-01-01
    • 2017-05-06
    • 2012-02-22
    相关资源
    最近更新 更多