Readonly struct vs classes

Предполагая, что у вас есть неизменные типы, и у вас есть весь ваш код до даты до С# 7.3, а ваши методы используют ключевое слово in для входных данных

Почему бы вам использовать класс вместо структуры readonly?

Недостаток использования структур заключался в том, что копирование было дорогостоящим, но при условии, что вы предотвращаете любую копию (защитную копию компилятора или выражаете кодом), readonly structs позволяет вам копировать ссылку только (как это делают классы) и избегать распределения кучи и давления на мусор коллектор.

Исключая особые случаи (которые, я думаю, это может быть очень большой объект, который не будет помещаться в стек), вы бы использовали readonly struct как первый выбор?

Меня интересует случай, когда они используются в качестве контейнеров данных.

Ответ 1

Структуры не следует рассматривать как "дешевые объекты"; они имеют аналогичные наборы функций, которые перекрываются в некоторых областях и не пересекаются в других. Например:

  • структуры не могут участвовать в полиморфизме
  • вы не можете рассматривать структуру как экземпляр интерфейса без бокса (caveat: "ограниченный вызов", но это работает только в некоторых сценариях)
  • многие API-интерфейсы библиотек не будут работать хорошо (или, возможно, вообще) с помощью структур - они ожидают изменчивых POCOs; вы, вероятно, захотите использовать библиотеку, чтобы получать данные из базы данных, сериализовать ее или отображать в пользовательском интерфейсе - все это немного забивает структуры
  • структуры не работают хорошо с некоторыми шаблонами, такими как отношения дерева или родства (Foo не может содержать Foo если он является структурой) - есть другие
  • структур и неизменяемых типов, может быть неудобно работать с

Кроме того, обратите внимание, что до недавнего времени ("ref возвращает" и "ref locals") было очень сложно достичь некоторых частей "readonly structs позволяют вам копировать только ссылку"; теперь это намного проще.

Но, откровенно говоря, в большинстве сценариев POCOs проще работать, и они подходят для большинства сценариев прикладного кода.

Конечно, времена, когда структуры являются удивительным выбором. Это не каждый раз. Однако я бы поддержал идею о том, что если вы собираетесь использовать struct, она должна быть либо readonly struct (по умолчанию), либо ref struct (если вы знаете, почему вы это делаете); mutable non- ref structs - это рецепт боли.