Если сущность будет неизменной, вопрос о том, использовать ли структуру или класс, обычно будет касаться производительности, а не семантики. В 32/64-битной системе для ссылок на классы требуется 4/8 байт для хранения, независимо от объема информации в классе; копирование ссылки на класс потребует копирования 4/8 байтов. С другой стороны, каждый отдельный экземпляр класса будет иметь 8/16 байтов служебной информации в дополнение к информации, которую он содержит, и стоимости памяти ссылок на него. Предположим, кто-то хочет массив из 500 объектов, каждый из которых содержит четыре 32-разрядных целых числа Если объект является структурным типом, массиву потребуется 8000 байтов независимо от того, все ли 500 объектов идентичны, различны или где-то между ними. Если сущность является типом класса, массив из 500 ссылок займет 4000 байтов. Если все эти ссылки указывают на разные объекты, для этих объектов потребуются дополнительные 24 байта каждый (12 000 байтов для всех 500), всего 16 000 байтов - вдвое больше, чем стоимость хранения типа структуры. С другой стороны, из кода, который создал один экземпляр объекта, а затем скопировал ссылку на все 500 слотов массива, общая стоимость составила бы 24 байта для этого экземпляра и 4000 для массива - всего 4024 байта. Основная экономия. Немногие ситуации сработают так же хорошо, как и последняя, но в некоторых случаях возможно скопировать некоторые ссылки на достаточное количество слотов массива, чтобы сделать такое совместное использование полезным.
Если объект должен быть изменчивым, вопрос о том, использовать ли класс или структуру, в некотором смысле проще. Предположим, что «Thing» - это либо структура, либо класс, у которого есть целочисленное поле с именем x, и каждый выполняет следующий код:
Thing t1,t2;
...
t2 = t1;
t2.x = 5;
Желает ли последнее утверждение повлиять на t1.x?
Если Thing является типом класса, t1 и t2 будут эквивалентны, то есть t1.x и t2.x также будут эквивалентны. Таким образом, второе утверждение повлияет на t1.x. Если Thing является структурным типом, t1 и t2 будут разными экземплярами, то есть t1.x и t2.x будут ссылаться на разные целые числа. Таким образом, второе утверждение не повлияет на t1.x.
Изменчивые структуры и изменяемые классы имеют принципиально различное поведение, хотя .net имеет некоторые особенности в обработке структурных мутаций. Если кто-то хочет поведение типа значения (имеется в виду, что «t2 = t1» будет копировать данные из t1 в t2, оставляя t1 и t2 как отдельные экземпляры), и если кто-то может согласиться с особенностями обработки значений в .net, используйте структура. Если кто-то хочет семантику типа значения, но причуды .net могут привести к нарушению семантики типа значения в приложении, используйте класс и бормотайте.