До вызова конструктора класса происходит выделение памяти для его полей, инициализация экземплярных полей значениями по умолчанию и служебных полей(указателя на объект тип и индекса блока синхронизации) Беспараметрический конструктор класса должен быть вызван всегда, в отличии от конструктора структуры, это нужно для того, чтобы указать явное выделение памяти под объект, потому что простое объявление переменной ссылочного типа(например MyClass @class), еще не означает, что экземпляр этого типа будет успешно создан, т.к возможно MyClass имеет приватный беспараметрический конструктор, поэтому для создания класса нужно явно вызвать его конструктор
Потому что при инлайн инициализации происходит инлайн проинициализированных полей в конструкторах(т.е в каждом объявленном конструкторе, если инлайнится экземплярное поле)
В конструкторах экземпляра (нестатическом конструкторе)
В конструкторе типа (статическом конструторе) 4) Есть ли разница между
MyStruct a;
MyStruct b = new MyStruct();
Нет, в С# у структуры нет беспараметрического конструктора, при вызове new MyStruct(), вызывается сгенерированный C# компилятором конструктор, который ничего не делает(но бывает удобен для вызова инициализатора), память структуре выделяется в момент объявления, также как и всем структурным полям в структуре, поля ссылочного типа будут иметь значения null.
Только если они статические, экземплярные нельзя потому что компилятор C# не генерирует IL код конструктора структуры, но генерирует статический конструктор, где они и инициализируются
Это решение разработчиков компилятора C#, для того, чтобы явно указать что такой конструктор не будет вызываться при создании структуры без явного его вызова
CLR не может запретить создание экземляров значимых типов, они всегда создаются, выделяется память для полей,беспараметрический конструктор не вызывается(даже если вызвать его явно) , в отличие от класса
Он должен инициализировать все поля, возможно из-за того, что инициализия полей до его вызова не происходит(догадка)