При (глубоком) клонировании используйте String.Copy или str1 = str2? - PullRequest
3 голосов
/ 25 февраля 2010

При (глубоком) клонировании пользовательского объекта мне следует использовать clone.str1 = String.Copy(obj.str1) или clone.str1 = obj.str1?

Я бы предпочел последнее - короче и быстрее, но действительно ли это "безопасно"?

Я бы указал на эту ветку , но, тем не менее, не уверен, что использовать.

Ответы [ 4 ]

10 голосов
/ 25 февраля 2010

Да - последний вариант (простое назначение) безопасен для строк (в управляемом коде), как показано в этом коде:

    string s1 = "Initial Value";
    string s2 = s1;

    Console.WriteLine("String1: " + s1);
    Console.WriteLine("String2: " + s2);

    s1 = "New Value";

    Console.WriteLine("String1 - after change: " + s1);
    Console.WriteLine("String2 - after change: " + s2);

Выход:

String1: Initial Value
String2: Initial Value
String1 - after change: New Value
String2 - after change: Initial Value

Строки являются неизменяемыми - поэтому, когда вы меняете s1, вы действительно создаете новую строку и присваиваете ее. Ссылка на s2 по-прежнему указывает на старый экземпляр.

3 голосов
/ 25 февраля 2010

Вызов String.Copy создаст отдельную копию строки.
Поскольку строки неизменяемы, в этом нет необходимости.

1 голос
/ 25 февраля 2010

при глубоком клонировании необходимо клонировать каждое изменяемое значение.Строка является изменяемой в .NET, так что да, вам следует ее клонировать.

edit: whoops ... кажется, что они неизменны, так что нет, вам не нужно.

1 голос
/ 25 февраля 2010

При глубоком клонировании, почему бы просто не использовать вместо него BinaryFormatter?

См. эту ссылку .

Вот код, который я написал по этой ссылке:

public Automobile Clone()
{
    Automobile result = null;
    using (MemoryStream ms = new MemoryStream())
    {
         BinaryFormatter bf = new BinaryFormatter();
         bf.Serialize(ms, this);
         ms.Position = 0;
         result = (Automobile)bf.Deserialize(ms);
     }
     return result;
}
...