.net 何时创建属性实例?

.net 何时创建属性实例?,.net,attributes,.net,Attributes,属性是否与应用它们的类的实例同时实例化?否。属性绑定到类型,因此在加载类型时实例化。在调用类型.GetCustomAttributes()时加载属性。如果您只是实例化该类或甚至获取该类型,则尚未加载属性 请参见此示例: class Program { static void Main() { Console.WriteLine("Calling AttributeLoadTest.TestStatic():"); Attribu

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

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

在调用
类型.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()

ConsoleStatAttribute构造函数


因此,调用静态方法、实例化类、获取类型并不会实例化属性。调用
GetCustomAttributes()
会执行此操作。

加载的是类型,而不是实例?否,加载类型时不会加载属性。它们在实际需要之前是不会加载的。奇怪。谢谢你的测试。现在我想知道是否(I)GetCustomAttributes每次调用时都会生成新的属性对象,以及(ii)属性类是否会更早加载。@JohnB,每次调用
GetCustomAttributes()
,都会创建一个新实例。感谢您做了这项非常有趣的研究。我自己刚刚遇到过这种行为,我想知道这背后的原因是什么?为什么一个类型的属性不能像其他类型的对象图一样预加载?@Martaver,延迟加载是软件开发中非常常见的做法。通常,在需要之前不加载东西会更有效。如果您通常不需要它们,它总是更有效。@SamualNeff感谢您的回复,我理解延迟加载的目的,但实际上我更感兴趣的是为什么属性需要延迟加载,而不是与父类型同时加载。经过一番挖掘,我在这里找到了答案:这是真的吗?属性是否在运行时开始之前或之后未绑定到类型?我是.net新手,但我注意到在代码中插入断点后,在我看来,我定义的自定义属性类在执行任何测试代码之前都已实例化。@Stewart,这是真的,我没有伪造控制台输出。:-)我现在重新检查了它,因为这篇文章已经发布了几年了,并且得到了与.NET4.0相同的结果。