Если структура будет иметь, и ее пользователи будут ожидать, все три из следующих характеристик:
- Все его состояние заключено в некоторый определенный фиксированный набор читаемых элементов.
- Может быть легко создан экземпляр, в котором эти члены имеют любую комбинацию значений, которые действительны для их соответствующих типов.
- Экземпляр типа по умолчанию должен иметь для всех этих элементов значения по умолчанию их соответствующих типов.
тип должен представлять свои элементы как поля. Вышеуказанные требования означают, что структура не сможет делать то, что не может сделать структура с открытыми полями, а также будет означать, что если код не сталкивается с опасностями потоков, структура сможет делать что-либо с открытым полем. struct может это сделать, хотя, возможно, медленнее и с более опасными потоками.
Если структура Foo
имеет поля f1
и f2
, и конструктор, который устанавливает эти поля в указанном порядке, и если fooExpr
является неким выражением типа Foo
[возможно, переменной, поле, ссылка на массив, свойство или что-либо еще] оператор:
myFoo.f2 = someValue;
будет разрешено только в тех случаях, когда по закону можно сказать
myFoo = new Foo(myFoo.f1, someValue);
и при всех обстоятельствах, когда разрешена первая форма и поведение второй формы имеет определенную семантику, они будут вести себя одинаково. Таким образом, попытка «инкапсулировать» свойства Foo
на самом деле ничего не дает, за исключением того, что код становится более громоздким для написания, менее понятным и более медленным для выполнения.