Пара баллов по классам против структур:
Классы передаются по ссылке, что означает, что один и тот же объект экземпляра передается между функциями. Если вы создаете MyClass в методе A и вызываете метод B, метод B меняет класс и ничего не возвращает методу A, метод A видит изменения, сделанные в MyClass, потому что они ссылаются на один и тот же объект. Ссылка обычно представляет собой int32, поэтому независимо от того, насколько велик ваш класс, он будет быстро вызывать метод B, потому что он пропускает только 4 байта. Классы полагаются на сборщик мусора, чтобы решить, когда он больше не используется (меньшие накладные расходы при передаче класса вокруг, но увеличивают накладные расходы сборщику мусора).
Структуры передаются по значению (или типу значения). Это означает, что вся структура копируется при передаче. Если ваша структура большая, это займет много времени. Изменение в структуре в методе B не будет отображаться в методе A, если только оно не будет возвращено (опять же, будет стоить времени, поскольку оно передается по значению), а метод A считывает возвращаемое значение. Структуры создаются в стеке и не требуют дополнительных затрат на сборку мусора (это можно увидеть, изучив код IL).
Существует множество ограничений в структурах по сравнению с классами, таких как отсутствие виртуальных методов и других полиморфных функций.
Лучше всего отдавать предпочтение классам, если только вы не собираетесь быстро создавать и отбрасывать множество объектов одним и тем же методом (который истощает системные ресурсы из-за сбора мусора), и в этом случае предпочтение сохраняется.