是否会为 C# 中的每个 class 实例创建一个属性实例?

Will an attribute instance be created for each instance of a class in C#?

是否会为 C# 中的每个 class 实例创建一个属性实例?

这就是我的意思。假设我们有以下代码:

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();
    }
}

我的问题是:是否会创建 MyAttribute 的两个实例(因为创建了 A 的两个实例)还是只会创建一个 MyAttribute 将在 A 个实例之间共享?

此外,我怀疑另一个可能的选择是不会创建 MyAttribute 的实例,因为当上面的代码运行时,没有任何输出到控制台。

因此,将创建 MyAttribute 的 0、1 或 2 个实例,我想知道确切的数量。如果答案不是 0,那么为什么我在控制台中看不到任何内容?

只有在您需要时才会创建属性实例。在您的示例中,您没有以任何方式获得这些属性,因此不会创建它们。

[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}");
        }
    }
}

使用此代码,您可以在控制台输出中看到两个不同的 guid。所以你的问题的答案是:

将为您 class 的每个实例创建新的属性实例,但仅在您需要时才创建

编辑: 每次您使用 GetCustomAttributes() 或任何类似方法请求时,都会创建新的属性实例。