是否会为 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() 或任何类似方法请求时,都会创建新的属性实例。
是否会为 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() 或任何类似方法请求时,都会创建新的属性实例。