Skip to content

Instantly share code, notes, and snippets.

  • Save eterekhin/1629ed5b5252ed91d618dc9c1345030f to your computer and use it in GitHub Desktop.
Save eterekhin/1629ed5b5252ed91d618dc9c1345030f to your computer and use it in GitHub Desktop.

До вызова конструктора класса происходит выделение памяти для его полей, инициализация экземплярных полей значениями по умолчанию и служебных полей(указателя на объект тип и индекса блока синхронизации) Беспараметрический конструктор класса должен быть вызван всегда, в отличии от конструктора структуры, это нужно для того, чтобы указать явное выделение памяти под объект, потому что простое объявление переменной ссылочного типа(например MyClass @class), еще не означает, что экземпляр этого типа будет успешно создан, т.к возможно MyClass имеет приватный беспараметрический конструктор, поэтому для создания класса нужно явно вызвать его конструктор

Почему инлайн инициализация полей привносит оверхед

Потому что при инлайн инициализации происходит инлайн проинициализированных полей в конструкторах(т.е в каждом объявленном конструкторе, если инлайнится экземплярное поле)

Где инициализируется экземплярные инлайн поля

В конструкторах экземпляра (нестатическом конструкторе)

Где инициализируется статические инлайн поля

В конструкторе типа (статическом конструторе) 4) Есть ли разница между

MyStruct a;
MyStruct b = new MyStruct();

Нет, в С# у структуры нет беспараметрического конструктора, при вызове new MyStruct(), вызывается сгенерированный C# компилятором конструктор, который ничего не делает(но бывает удобен для вызова инициализатора), память структуре выделяется в момент объявления, также как и всем структурным полям в структуре, поля ссылочного типа будут иметь значения null.

Можно ли использовать инлайн поля в структуре

Только если они статические, экземплярные нельзя потому что компилятор C# не генерирует IL код конструктора структуры, но генерирует статический конструктор, где они и инициализируются

Почему нельзя определить беспараметрический конструктор в структуре

Это решение разработчиков компилятора C#, для того, чтобы явно указать что такой конструктор не будет вызываться при создании структуры без явного его вызова

Почему структуры всегда проинициализированы

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

Какие ограничения накладываются на параметрический конструктор структуры

Он должен инициализировать все поля, возможно из-за того, что инициализия полей до его вызова не происходит(догадка)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment