如何在c#中创建一个对象的副本
这个问题在这里已经有了答案:
你的对象中的属性是值类型,你可以像这样使用浅色副本:
obj myobj2 = (obj)myobj.MemberwiseClone();
但在其他情况下,如果有任何成员是引用类型,则需要使用Deep Copy。 您可以使用此方法获得对象的深层副本:
public static T DeepCopy<T>(T other)
{
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, other);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
附加信息:(您也可以从MSDN阅读本文)
浅拷贝是创建一个新对象,然后将当前对象的非静态字段复制到新对象。 如果一个字段是一个值类型,则会执行字段的逐位拷贝; 对于引用类型,引用被复制但引用的对象不是; 因此原始对象及其克隆涉及同一个对象。
深度复制正在创建一个新对象,然后将当前对象的非静态字段复制到新对象。 如果某个字段是值类型,则会执行该字段的逐位副本。 如果某个字段是引用类型,则执行引用对象的新副本。
您可以使用MemberwiseClone
obj myobj2 = (obj)myobj.MemberwiseClone();
副本是一个浅拷贝,这意味着克隆中的引用属性指向与原始对象相同的值,但这不应该成为您的情况中的问题,因为obj
中的属性是值类型。
如果你拥有源代码,你也可以实现ICloneable
这听起来像是你寻找一种简单的方式松散地耦合你的对象,但保持允许在需要时改变值的能力。
在类之间传递值的一种方式可以是这样的。
public class Folders
{
public string Source { get; private set; }
public string Target { get; private set; }
public Folders(string source, string target)
{
if (String.IsEmptyOrNull(source) && String.IsEmptyOrNull(target))
{
throw new Exception("Null Parameter");
}
else
{
Source = source;
Target = target;
}
}
}
所以我们创建了一个名为Folders
的特定对象。 现在可以在这样的第二个类文件中调用它:
public bool CopyDirectory(string _source, string _destination)
{
var dirStack = new Stack<Folders>();
dirStack.Push(new Folders(_source, _destination));
// Perform stuff related to this method.
}
所以在我们的第二课中,我们将方法参数传递给这个原始类,它将设置我们的值并允许我们操纵它们。
我们有另一种方法,所以在一个单独的类中可以说我们想使用我们的构造函数来传递变量。 这将允许初始参考,然后是如果我们选择实际偏离的能力。
public class DirectoryManagement
{
private Folders _folder { get; private set; }
public DirectoryManagement(Folders folder)
{
_folder = folder;
}
}
所以当我们使用这种方式时,我们实际上确保最初传递给我们Folders
类的参数传递到我们的新类DirectoryManagement
。 这将允许我们将这些值链接到其他变量,使用这些值或任何我们的需求。
我不确定这种方法或所列方法是否是您理想的解决方案。 但我想我会提出另一种传递和使用现有变量的方式。 MemberwiseClone
一些细节可以在这里找到。