Are attributes instantiated at the same time as instances of the class to which they are applied?
Attributes are loaded when the Type.GetCustomAttributes()
is called. If you just instantiate the class or even get the type, the attributes are not yet loaded.
See this example:
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");
}
}
This prints out:
Calling AttributeLoadTest.TestStatic():
Loading class
Loading type..
Calling GetCustomAttributes()
ConsoleTestAttribute Constructor
So calling a static method, instantiating the class, getting the type, does not instantiate the attribute. Calling GetCustomAttributes()
does.
No. Attributes are bound to the type and thus instantiated when the type is loaded.