Здравствуйте, 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 свойства.