我在看实现 ICloneable
的一个类的接口。
该类如下。
public class TempClass
{
String[] names;
String[] values;
}
创建了一个部分类,实现了 TempClass
public partial class TempClass:ICloneable
{
public Object Clone()
{
TempClass cloneClass = new TempClass();
String[] cloneNames = new String[this.names.Length - 1];
String[] cloneValues = new String[this.values.Length -1];
Array.Copy(this.names,cloneNames,this.names.Length);
Array.Copy(this.values,cloneValues,this.values.Length);
cloneClass.names = cloneNames;
cloneValues.values = cloneValues;
return cloneClass;
}
}
我想知道这是否是对一个对象进行深度复制的有效方法?在这里引起注意的是中间结构 cloneNames
和 cloneValues
用于复制原始对象的值,并具有成员变量的 Names
和 Values指向它,然后返回在clone方法中创建的对象引用。
如果有任何关于这段代码的反馈,我们将不胜感激。
谢谢你
解决方案:
Array.Clone
和 Array.Copy
都会创建浅层副本(如链接的API文档中所述),但使用字符串数组会使问题变得模糊,因为字符串在.NET中是不可变的。当你这样做的时候。
stringArray[0] = "first value";
stringArray[0] = "second value";
第一个字符串实例会被一个不同的实例所取代,所以看起来你已经做了一个深层拷贝(对于字符串数组,你可能已经做了)。
要对一个具有普通引用类型的数组的对象进行深度复制,你需要为数组元素创建新的实例。比如说 TempClass
储存了一个 Cookie
对象而不是字符串。
public Object Clone() {
TempClass clone = new TempClass();
clone.cookieArray = new Cookie[this.cookieArray.Length];
for(int i = 0; i < this.cookieArray.Length; i++) {
Cookie cookie = this.cookieArray[i];
clone.cookieArray[i] = new Cookie(cookie.Name, cookie.Value, cookie.Path, cookie.Domain);
}
}
本文来自投稿,不代表实战宝典立场,如若转载,请注明出处:https://www.shizhanbaodian.com/27825.html