潍坊网站定制模板建站,电脑版传奇网站,广州越秀区天气预报15天查询,网站建设实训过程报告好吧#xff0c;我承认#xff0c;这是一个反标题#xff0c;实际的情况是#xff1a;我找不到一个非用ICloneable不可的理由。事实上#xff0c;接口ICloneable还会带来误解#xff0c;因为它只有一个Clone方法。 我们都知道#xff0c;对象的拷贝分为#xff1a;浅拷…好吧我承认这是一个反标题实际的情况是我找不到一个非用ICloneable不可的理由。事实上接口ICloneable还会带来误解因为它只有一个Clone方法。 我们都知道对象的拷贝分为浅拷贝和深拷贝。ICloneable仅有一个Clone方法使我们无法从命名的角度去区分到底是哪个拷贝。 浅拷贝将对象的字段复制到副本新的对象中同时将字段的值也赋值过去但是引用类型字段只复制引用而不是引用类型本身。这意味着源对象引用类型字段的值改变了会影响到副本中对应的值也改变 深拷贝将对象的字段复制到副本新的对象中无论是值类型还是引用类型字段都会复制类型本身及类型的值。这意味着源对象引用类型字段的值改变了不会影响到副本中对应的值 于是问题来了如果类型继承了ICloneable接口那么类型中的Clone是浅拷贝还是深拷贝。微软的解释是你既可以在Clone方法中实现浅拷贝也可以实现深拷贝。那么为什么不直接提供两个方法呢比如DeepClone或者ShallowClone。还是一般类型的创建只要实现了浅拷贝就不需要再实现深拷贝或者反之所以我们没有必要提供两个方法。 下面是一个既实现了浅拷贝也实现深拷贝的例子 代码 [Serializable]class Employee : ICloneable{publicstring IDCode { get; set; }publicint Age { get; set; }public Department Department { get; set; }#region ICloneable 成员publicobject Clone(){returnthis.MemberwiseClone();}#endregionpublic Employee DeepClone(){using (Stream objectStream new MemoryStream()){IFormatter formatter new BinaryFormatter();formatter.Serialize(objectStream, this);objectStream.Seek(0, SeekOrigin.Begin);return formatter.Deserialize(objectStream) as Employee;}}public Employee ShallowClone(){return Clone() as Employee;}} 实际上ICloneable还带来一个问题该问题Bill Wagner在Effcitive c#中曾经论述过那就是如果类型继承自ICloneable但是同时它不是一个Sealed类型的话它们的子类的默认Clone方法会带来BUG子类的Clone方法会返回父类的副本而不是子类本身。这会逼迫所有的子类都重写Clone方法 ICloneable的Clone方法的另一个问题是它不是类型安全的它返回的是Object使用它的时候还设计到转型的问题而我们自己实现的Clone方法却可以规避掉这个问题如上文代码。 综上所述类型确实没必要继承ICloneable接口如果类型本身需要实现拷贝功能直接公开方法就行。如果在应用中你觉得确实必须实现这个接口的来指正我吧。 转载于:https://www.cnblogs.com/Chary/p/No0000178.html