【发布时间】:2011-01-21 00:41:36
【问题描述】:
当(深度)克隆自定义对象时,我应该使用clone.str1 = String.Copy(obj.str1) 还是clone.str1 = obj.str1?
我更喜欢后者——更短、更快,但它“安全”吗?
我会指向this thread,但是,不确定要使用什么。
【问题讨论】:
当(深度)克隆自定义对象时,我应该使用clone.str1 = String.Copy(obj.str1) 还是clone.str1 = obj.str1?
我更喜欢后者——更短、更快,但它“安全”吗?
我会指向this thread,但是,不确定要使用什么。
【问题讨论】:
调用String.Copy 将创建一个单独的字符串副本。
由于字符串是不可变的,因此没有必要这样做。
【讨论】:
当进行深度克隆时,为什么不直接使用 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;
}
【讨论】:
进行深度克隆时,您需要克隆每个可变值。字符串在 .NET 上是可变的,所以是的,你应该克隆它。
edit: 哎呀......似乎它们是不可变的,所以不,你不需要。
【讨论】:
是的 - 后一种选择(简单赋值)对于字符串(在托管代码中)是安全的,如下代码所示:
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 的引用仍然指向旧实例。
【讨论】: