何时(深入)克隆自定义对象,我应该使用clone.str1 = String.Copy(obj.str1)
还是clone.str1 = obj.str1
?
我更喜欢后者 - 更短更快,但它是否“安全”?
我指向this thread,但是,不确定要使用什么。
答案 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上是可变的,所以是的,你应该克隆它。
编辑哎呀...似乎它们是不可变的,所以不,你不需要。