Инициализация общих статических полей - PullRequest
5 голосов
/ 16 сентября 2011

Мне просто интересно узнать следующий код:

public static class Container<T>
{
    public static readonly T[] EmptyArray = new T[0];
}

Как я понял, статический класс Container будет инициализирован при выполнении следующего кода:

...
var emptyArray = Container<int>.EmptyArray;
...

Я прав ?Будем благодарны за любые пояснения по инициализации статических обобщенных классов / членов.Заранее спасибо.

Ответы [ 2 ]

8 голосов
/ 16 сентября 2011

Гарантия состоит в том, что статическое поле инициализируется до того, как вы получите к нему доступ. (А также, если есть статический конструктор, то все статические поля будут инициализированы до запуска статического конструктора.)

Для универсальных классов статическая инициализация работает для каждого типа, поэтому Container<int> действует так, как будто это совершенно другой класс, чем Container<double>. Это действительно верно для всех статических частей универсального класса - каждый тип получает свою собственную копию.

Пример покажет эту последнюю точку более четко:

static class Foo<T>
{
    static int count = 0;
    public static int Increment()
    {
        return ++count;
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Foo<int>.Increment());
        Console.WriteLine(Foo<int>.Increment());
        Console.WriteLine(Foo<double>.Increment());
    }
}

Выход:

1
2
1
4 голосов
/ 16 сентября 2011

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

public static class Container<T>
{
    public static readonly T[] EmptyArray;

    static Container()
    {
        EmptyArray = new T[];
    }
}

От MSDN о статических конструкторах:

Он [Статический конструктор] вызывается автоматически перед созданием первого экземпляра или ссылками на любые статические элементы.

Поскольку Container<string> и Container<bool> не совпадают, статический конструктор вызывается один раз для каждого типа T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...