Ответ 1
Структуры не следует рассматривать как "дешевые объекты"; они имеют аналогичные наборы функций, которые перекрываются в некоторых областях и не пересекаются в других. Например:
- структуры не могут участвовать в полиморфизме
- вы не можете рассматривать структуру как экземпляр интерфейса без бокса (caveat: "ограниченный вызов", но это работает только в некоторых сценариях)
- многие API-интерфейсы библиотек не будут работать хорошо (или, возможно, вообще) с помощью структур - они ожидают изменчивых POCOs; вы, вероятно, захотите использовать библиотеку, чтобы получать данные из базы данных, сериализовать ее или отображать в пользовательском интерфейсе - все это немного забивает структуры
- структуры не работают хорошо с некоторыми шаблонами, такими как отношения дерева или родства (
Foo
не может содержатьFoo
если он является структурой) - есть другие - структур и неизменяемых типов, может быть неудобно работать с
Кроме того, обратите внимание, что до недавнего времени ("ref возвращает" и "ref locals") было очень сложно достичь некоторых частей "readonly structs позволяют вам копировать только ссылку"; теперь это намного проще.
Но, откровенно говоря, в большинстве сценариев POCOs проще работать, и они подходят для большинства сценариев прикладного кода.
Конечно, времена, когда структуры являются удивительным выбором. Это не каждый раз. Однако я бы поддержал идею о том, что если вы собираетесь использовать struct
, она должна быть либо readonly struct
(по умолчанию), либо ref struct
(если вы знаете, почему вы это делаете); mutable non- ref
structs - это рецепт боли.