Структуры в C# и ее плюсы

Где можно использовать структуры? И в каких ситуациях лучше прибегнуть к структурам, нежели к классам?


Ответы (3 шт):

Автор решения: Aziz Umarov

Вольный перевод кусочка отсюда

struct is a value type, so it is faster than a class object. Use struct whenever you want to just store the data. Generally, structs are good for game programming. However, it is easier to transfer a class object than a struct. So do not use struct when you are passing data across the wire or to other classes.

struct - это значимый тип, поэтому он быстрее, чем объект класса. Используйте struct всякий раз, когда вы хотите просто хранить данные. Как правило, структуры подходят для программирования игр. Однако легче передать объект класса, чем структуру. Поэтому не используйте структуру при передаче данных по сети или другим классам.

→ Ссылка
Автор решения: S.H.

Это довольно интересный вопрос.

С одной стороны, структуры в C# есть. Но они очень похожи на классы: у них тоже есть конструкторы - деструкторы, методы. Не надо заботиться об инициализации полей структур - .NET не забудет это сделать.

Единственная разница, которая приходит в голову - что поля структуры нельзя инициализировать в момент объявления.

И что при создании экземпляра структуры new не нужен, достаточно простого объявления вида

    UserIunfo ui;
    ui.Name = "Cat";

Главное отличие структур от классов - в реализации. Любой экземпляр класса создаётся в "куче" (heap) (потому, что класс - это ссылочная структура данных), а экземпляры структур создаются в стеке, как простые переменные примитивных типов.

Это приводит к тому, что активное создание - освобождение экземпляров классов даст работу garbage collector, а экземпляров структур - нет. В целом, счтруктуры нужны там, где производительность на первом месте, и данных "не очень много".

Некоторые преимущества структур, которые проявлялись в C/C++: можно было напрямую записывать "набор байтов длииной со структуру" в бинарный файл - и это было сохранение значения структуры в файле! безо всяких сериализаций. А потом точно такое же считывание. Или - передача по сети.

В комментариях мне подсказывают, что такие же возможности есть и в C#, но использовать их сложнее, чем в C++.

Если я найду примеры такого использования - я постараюсь дополнить этот ответ.

→ Ссылка
Автор решения: Andrei Khotko

Есть старый гайд в документации майкрософт о том, когда использовать классы, а когда структуры. Там дается достаточное описание классам и структурам, а также разницы между ними.

Где можно использовать структуры? И в каких ситуациях лучше прибегнуть к структурам, нежели к классам?

Резюмирую ответ на ваш вопрос из этой статьи:

Как правило, большинство типов в разрабатываемых фреймворках на C# представлены классами. Однако иногда структуры будут более подходящим типом ввиду того, что они относятся к значимым типам (основное преимущество - высокая производительность при правильном использовании).

✔️ ИСПОЛЬЗУЙТЕ структуры вместо класса, если экземпляры типа занимают небольшой размер в памяти, и чаще всего недолговечны или встраиваются в другие объекты.

❌ НЕ ИСПОЛЬЗУЙТЕ структуры, если тип не обладает всеми нижеперечисленными характеристиками:

  • Логически представляет собой одно значение, подобное примитивным типам (int, double и т.д.);
  • Размер экземпляра этого типа занимает менее 16 байт в памяти;
  • Он должен быть неизменяемым (immutable);
  • Его не придется часто упаковывать (boxing).
→ Ссылка