Было бы неплохо, если бы CLR позволил гарантировать, что для объектов структурного типа может быть запущен некоторый код инициализации, прежде чем они станут видимыми для чего-либо вне такого кода.Это было бы возможно сделать даже при создании массива структурного типа, передав CLR по ссылке на все отдельные элементы массива, прежде чем ссылка на сам массив была открыта где-либо.К сожалению, это привело бы к неловкой ситуации, если бы при создании массива возникло исключение.Если бы у конструкторов не было побочных эффектов, проблем не было бы - просто отбросить массив и сделать вид, что даже успешно созданных объектов никогда не было.Конструкторы с побочными эффектами, однако, могут вызвать некоторые трудности.
Поскольку, однако, нет способа инициализировать структуры при построении, и, следовательно, нет хорошего способа достижения семантики типа значения с объектами, требующими инициализации.Сожалею.Даже если семантика значения-типа будет более подходящей для вашего типа (как это было бы гораздо чаще, чем некоторые считают), вам придется использовать ссылочный тип, если необходима инициализация.Ленивая инициализация структур на самом деле не работает.Например, если у вас есть словарьназывается MyDict, повторный доступ к MyDict («Джордж»). FrontLine будет генерировать новый список.Противный.
Изменчивые структуры не являются злом;Я, во всяком случае, один из их сильных защитников.Тем не менее, есть некоторые ограничения в обработке .net изменяемых структур в .net, и, таким образом, существует много обстоятельств, когда семантика типа значения была бы уместной, но ограничения .net делают невозможным правильное предоставление такой семантики.