Как работают струны при мелком копировании чего-либо на С#?

Строки считаются ссылочными типами, но могут действовать как значения. Когда мелкое копирование чего-либо вручную или с помощью элемента MemberwiseClone(), как обрабатываются строки? Рассматриваются ли они отдельно и изолированы от копии и мастера?

Ответы

Ответ 1

Строки ARE ссылочные типы. Однако они неизменяемы (они не могут быть изменены), поэтому было бы неважно, копируются ли они по значению или копируются по ссылке.

Если они скопированы в мелкие скобки, ссылка будет скопирована... но вы не можете изменить их, чтобы сразу не влиять на два объекта.

Ответ 2

Рассмотрим это:

public class Person
{
    string name;
    // Other stuff
}

Если вы вызываете MemberwiseClone, вы получите два отдельных экземпляра Person, но их переменные name, в то время как разные, будут иметь одинаковое значение - они будут ссылаться на один и тот же экземпляр строки. Это потому, что это мелкий клон.

Если вы измените имя в одном из этих экземпляров, это не повлияет на другое, потому что две переменные сами по себе являются отдельными - вы просто изменяете значение одного из них, чтобы ссылаться на другую строку.

Ответ 3

Вы копируете только ссылку (подумайте "указатель" ); две ссылки являются отдельными (но имеют одинаковое значение), но существует только один строковый объект.