Зачем нам нужен статический приватный массив для инициализации других нестатических полей приватного массива? - PullRequest
2 голосов
/ 31 августа 2010

Если вы загляните внутрь класса Stack<T> из .NET 4.0, вы заметите, что есть частное статическое поле emptyArray, которое используется внутри конструкторов для инициализации реального частного поля массива.

private T[] array;
private static T[] emptyArray;
private int size;
private int version;

static Stack()
{
    Stack<T>.emptyArray = new T[0];
}

public Stack()
{
    array = Stack<T>.emptyArray;
    size = 0;
    version = 0;
}

Почему бы просто не поставить this.array = new T[0];?А также, почему имеются размещенные штрихи инициализации для полей размера и версии, если вы пропустите эти строки, они все равно будут инициализированы значениями по умолчанию (0).

1 Ответ

1 голос
/ 31 августа 2010

Это потому, что в противном случае каждый Stack получает свой собственный экземпляр new T[0]. Теперь все они ссылаются на один и тот же экземпляр: тот, который объявлен статическим. Предположим, вы объявляете 1000 Stack<string>. Все они имеют ссылку на один string[0] объект. Если вы объявите пустой массив внутри конструктора, у вас будет 1000 string[0] экземпляров, по одному на каждый Stack<string>. Так что из соображений производительности.

Другие инициализаторы не нужны, но если вы посмотрите на Reflector через другие исходные файлы, вы увидите одинаковый шаблон везде: полям со значениями по умолчанию присваиваются явные значения внутри конструктора.

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