Структуры и типы значений являются объектами вне иерархии объектов .net, но каждый раз, когда вы определяете структуру, система также определяет псевдокласс, производный от ValueType, который в основном ведет себя как структура; расширяющиеся операторы преобразования определены между структурой и псевдоклассом. Обратите внимание, что переменные, параметры и поля, которые объявлены как имеющие интерфейсный тип, всегда обрабатываются как объекты класса. Если что-то будет использоваться в качестве интерфейса в какой-либо значительной степени, во многих случаях это может быть также класс.
Хотя некоторые люди ругаются по поводу зла изменчивых структур, есть много мест, где изменяемые структуры с семантикой значений были бы очень полезны , если бы не недостатки в работе с ними . Например:
- Методы и свойства, которые изменяют "self", должны быть помечены атрибутом, который запрещал бы их применение в контекстах только для чтения; Методы без такого атрибута должны быть запрещены для изменения "я", если они не скомпилированы с переключателем совместимости.
- Должны быть способы передачи ссылок на структуры или их поля путем выворачивания определенных выражений наизнанку или наличия стандартного типа пары «свойство-делегат», чтобы упростить такие вещи, как myDictOfPoints («George»). X ++;
Зачастую семантика типа значения была бы гораздо более «ожидаемой», чем эталонная семантика, если бы не только тот факт, что первые так плохо поддерживаются в некоторых распространенных языках.
PS - Я бы предположил, что хотя изменяемые структуры часто являются хорошей и подходящей вещью, члены структуры, изменяющие "я", обрабатываются плохо и их следует избегать. Либо используйте функции, которые будут возвращать новую структуру (например, «AfterMoving (Double distanceMiles, Double headingDegrees)»), которая будет возвращать новый LatLong, положение которого было бы там, где он будет находиться после перемещения указанного расстояния), либо используйте статические методы (например, «MoveDistance» (ref LatLong position, Double distanceMiles, Double headingDegrees) "). Изменяемые структуры обычно следует использовать в местах, где они по существу представляют группу переменных.