Информация об изменениях

Сообщение Re: Тонкости инициализации от 25.01.2022 4:27

Изменено 25.01.2022 4:28 Sinclair

Re: Тонкости инициализации
Здравствуйте, vaa, Вы писали:

vaa>пара вопросов.

vaa>
vaa>Person alice = new() { Name = "Alice" };
vaa>Person bob;
vaa>bob.Name = "Bob";

vaa>public struct Person { public string Name; }
vaa>

vaa>В чем разница?
В том, что если сеттер Name бросит исключение, то в alice останется null, а bob получит адрес недоконструированного объекта. Это может быть важно, если речь идёт не о локальных переменных, а о полях объекта, видимого за пределами текущего стека.
И еще — в том, что если Name является init-only, то второй способ просто не скомпилируется.
См. https://dotnetfiddle.net/UB2e6X
vaa>Быть может как C++ будет адрес отличаться (стэк или куча)?
нет.
vaa>и второй вопрос.
vaa>отличается ли метод конструктора класса чем либо от обычного?
да, отличается.
vaa>Какие-то ограничения имеются быть может?
В конструкторе можно инициализировать readonly поля и init-only свойства.
Re: Тонкости инициализации
Здравствуйте, vaa, Вы писали:

vaa>пара вопросов.

vaa>
vaa>Person alice = new() { Name = "Alice" };
vaa>Person bob;
vaa>bob.Name = "Bob";

vaa>public struct Person { public string Name; }
vaa>

vaa>В чем разница?
Если исправить ошибку, добавив Person bob = new();, то в том, что если сеттер Name бросит исключение, то в alice останется null, а bob получит адрес недоконструированного объекта. Это может быть важно, если речь идёт не о локальных переменных, а о полях объекта, видимого за пределами текущего стека.
И еще — в том, что если Name является init-only, то второй способ просто не скомпилируется.
Без исправления приведённый код просто не скомпилируется из-за отсутствия definite assignment.
См. https://dotnetfiddle.net/UB2e6X
vaa>Быть может как C++ будет адрес отличаться (стэк или куча)?
нет.
vaa>и второй вопрос.
vaa>отличается ли метод конструктора класса чем либо от обычного?
да, отличается.
vaa>Какие-то ограничения имеются быть может?
В конструкторе можно инициализировать readonly поля и init-only свойства.