Типы неизменяемых значений и типы неизменяемых ссылок семантически практически идентичны;единственные различия состоят в том, что ссылочные типы поддерживают проверки на равенство ссылок, которые могут иметь или не иметь смысл, и что типы значений могут быть заключены в Nullable (Of T), в то время как ссылочные типы неявно обнуляются.Если тип будет неизменным, в зависимости от того, как он будет использоваться, могут быть причины производительности для предпочтения структуры или класса;Структуры быстрее для некоторых операций (почти все операции для размеров менее четырех байтов), в то время как классы могут работать быстрее для некоторых других (особенно для вещей размером более 16 байтов).Кроме того, некоторые типы операций по существу невозможны со структурами.
Изменяемые типы структур полезны, в отличие от того, что утверждают некоторые скептики, но есть некоторые предостережения.Если у кого-то есть переменная, которая содержит ссылку на изменяемый объект класса, и кто-то делает что-то, чтобы изменить этот объект, это изменение будет эффективно «видно» всем, что содержит ссылку на этот объект.Если кто-то хочет изменить объект, не нарушая ничего другого, он должен знать, что он содержит единственную ссылку на этот объект.Часто единственный способ убедиться в этом - скопировать все данные из объекта в новый экземпляр объекта, а затем внести изменения в этот новый экземпляр.В отличие от этого, если у вас есть изменяемая структура, вы можете просто вносить любые изменения без необходимости создавать новый экземпляр.
Единственная реальная проблема с изменяемыми структурами заключается в том, что .net использует различные абстракции, чтобы заставить их вести себякак часть единой системы типов, и эти абстракции могут привести к тому, что копии структур будут использоваться в местах, где логически должны использоваться оригиналы.Не всегда очевидно, когда могут произойти эти замены, и они могут привести к запутанному и ошибочному поведению.