当(深)克隆时,使用String.Copy或str1 = str2?

时间:2010-02-25 14:15:15

标签: .net string clone

何时(深入)克隆自定义对象,我应该使用clone.str1 = String.Copy(obj.str1)还是clone.str1 = obj.str1

我更喜欢后者 - 更短更快,但它是否“安全”?

我指向this thread,但是,不确定要使用什么。

4 个答案:

答案 0 :(得分:10)

是的 - 后一种选择(简单分配)对字符串是安全的(在托管代码中),如下代码所示:

    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的引用仍然指向旧实例。

答案 1 :(得分:3)

调用String.Copy将创建字符串的单独副本 由于字符串是不可变的,因此不需要这样做。

答案 2 :(得分:1)

深度克隆时,为什么不直接使用BinaryFormatter?

请参阅this link

以下是我在该链接上编写的代码:

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;
}

答案 3 :(得分:1)

深度克隆时,您需要克隆每个可变值。字符串在.NET上是可变的,所以是的,你应该克隆它。

编辑哎呀...似乎它们是不可变的,所以不,你不需要。