Будет ли создаваться экземпляр атрибута для каждого экземпляра класса в C#? - PullRequest
1 голос
/ 04 августа 2020

Будет ли экземпляр атрибута создаваться для каждого экземпляра класса в C#?

Вот что я имею в виду. Предположим, у нас есть следующий фрагмент кода:

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, потому что при запуске приведенного выше кода ничего не выводится на консоль.

Итак, будет создано 0, 1 или 2 экземпляра MyAttribute, и я хотел бы знать, сколько именно. И если ответ не 0, то почему я ничего не вижу в консоли?

1 Ответ

2 голосов
/ 04 августа 2020

Экземпляры атрибутов не создаются, пока они вам не понадобятся. В вашем примере вы никак не получаете эти атрибуты, поэтому они не создаются.

[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 в выводе консоли. Итак, ответ на ваш вопрос:

Новый экземпляр атрибута будет создан для каждого экземпляра вашего класса, но только тогда, когда он вам понадобится

EDIT: новый экземпляр атрибута будет создаваться каждый раз, когда вы его запрашиваете с GetCustomAttributes () или любым аналогичным методом.

...