Will an attribute instance be created for each instance of a class in C#?
Here is what I mean. Let us suppose we have the following piece of code:
using System;
public class MyAttribute : Attribute
{
public MyAttribute()
{
Console.WriteLine("attr got created");
}
}
[MyAttribute()]
public class A
{
}
public class Program
{
public static void Main()
{
new A();
new A();
}
}
My question is: will there be created two instances of the MyAttribute
(because there are two instances of the A
are created) or will there be created only a single instance of the MyAttribute
which will be shared across the A
instances?
Also, I suspect another possible option is that no instance of the MyAttribute
will be created, because when the above code runs nothing gets output to console.
So, it is either 0, 1 or 2 instances of the MyAttribute
will be created and I would like to know how many exactly. And in case the answer is not 0, then why don`t I see anything in console?
Attribute instances are not created until you need them. In your sample you do not get these attributes in any way, so they are not created.
[AttributeUsage(AttributeTargets.Class)]
public class MyAttribute : Attribute
{
public Guid MyGuid { get; set; }
public MyAttribute()
{
System.Console.WriteLine("attr got created");
MyGuid = Guid.NewGuid();
}
}
[My]
public class A
{
}
class Program
{
static void Main(string[] args)
{
var a1 = new A();
var a2 = new A();
var attributes = new List<A> {a1, a2}.SelectMany(a => a.GetType().GetCustomAttributes<MyAttribute>());
foreach (var attribute in attributes)
{
System.Console.WriteLine($"MyAttribute has id {attribute.MyGuid}");
}
}
}
With this code you can see two different guids in console output. So answer for your question is:
New attribute instance will be created for every instance of your class but only when you need it
EDIT: New attribute instance will be created every time you request it with GetCustomAttributes() or any similar method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With