В CLR через С#, Рихтер отмечает, что инициализация полей в объявлении класса, например,
class C {
int x = 3;
int y = 4;
public C() { ... }
public C(int z) { ... }
...
}
приводит к вставке операторов в начале каждого конструктора, которые задают поля заданным значениям. Таким образом, строка int x = 3;
выше будет отвечать за две отдельные инициализации: одну в конструкторе без параметров и одну в конструкторе, которая принимает аргумент int
.
Рихтер продолжает:
Это означает, что вы должны знать о взрыве кода [...] Если у вас несколько инициализированных полей экземпляра и много перегруженных методов конструктора, вы должны рассмотреть возможность определения полей без инициализации, создав один конструктор, который выполняет общая инициализация, и каждый конструктор явно вызывает общий конструктор инициализации. Этот подход уменьшит размер сгенерированного кода.
У меня возникли проблемы с представлением сценария, в котором это станет заметной проблемой, и это заставляет меня задаться вопросом, не хватает ли я чего-то здесь. Например, если мы предположим, что наш класс имеет десять конструкторов и сто полей, и для выполнения инициализации требуется, скажем, шестнадцать байтов исходного машинного кода, тогда мы говорим о суммарном 16 Кбайт генерируемого кода. Несомненно, что ничтожный объем памяти на любом компьютере в этом веке, верно?
Я предполагаю, что использование дженериков может умножить это на небольшой коэффициент, но все же влияние на рабочий набор кажется довольно небольшим.
Вопрос: Я что-то пропустил здесь, и если да, то что?
В то время как мой вопрос в основном теоретический - я хочу проверить свое собственное понимание - это также немного практично, поскольку инициализация полей, где они объявлены, кажется, создает значительно более читаемый код, чем использование централизованного конструктора, такого как Рихтер,.