Все string
объекты неизменны в C #. Созданные объекты класса string
никогда не могут представлять никакого значения, кроме того, с которым они были построены. Все операции, которые, кажется, «изменяют» строку, вместо этого производят новую. Это неэффективно с памятью, но чрезвычайно полезно для уверенности в том, что строка не изменит форму под вами - потому что, пока вы не измените свою ссылку, строка, на которую вы ссылаетесь, никогда не изменится.
У изменчивого объекта, напротив, есть поля данных, которые могут быть изменены. Один или несколько его методов изменят содержимое объекта, или у него есть свойство, которое при записи изменяет значение объекта.
Если у вас есть изменяемый объект - наиболее похожий на String - StringBuffer
- тогда вам нужно сделать его копию, если вы хотите быть абсолютно уверены, что он не изменится из-под вас. Вот почему изменяемые объекты опасны для использования в качестве ключей в любой форме Dictionary
или для установки - сами объекты могут измениться, а структура данных не сможет знать, что приведет к повреждению данных, что в конечном итоге приведет к сбою вашей программы. .
Однако вы можете изменить его содержимое, так что это намного, намного эффективнее, чем создание полной копии, потому что вы хотели изменить один символ или что-то подобное.
Как правило, правильнее всего использовать изменяемые объекты при создании чего-либо и неизменные объекты после завершения. Конечно, это относится к объектам, которые имеют неизменные формы; большинство коллекций этого не делают. Часто бывает полезно предоставлять формы коллекций только для чтения, что эквивалентно неизменяемости при отправке внутреннего состояния вашей коллекции в другие контексты - в противном случае что-то может принять это возвращаемое значение, что-то с ним сделать и испортить ваш данные.