Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何复制对象的实例?_C#_.net_Oop - Fatal编程技术网

C# 如何复制对象的实例?

C# 如何复制对象的实例?,c#,.net,oop,C#,.net,Oop,我试图编写一些代码来填充列表(实际上,它是一系列列表,但我们可以假设它只是一个列表)。我们的想法是将IPackage添加到列表中,以查看订购的IPackage的总数量。请参阅以下代码: ParseExcel pe = new ParseExcel(); Pinnacle p = pe.ParsePinnacleExcel(); Rack r = new Rack(20,2,4.5,96,42,6,25*12); foreach (P

我试图编写一些代码来填充
列表
(实际上,它是一系列
列表
,但我们可以假设它只是一个
列表
)。我们的想法是将
IPackage
添加到
列表中,以查看订购的
IPackage
的总数量。请参阅以下代码:

        ParseExcel pe = new ParseExcel();
        Pinnacle p = pe.ParsePinnacleExcel();
        Rack r = new Rack(20,2,4.5,96,42,6,25*12);
        foreach (PinnacleStock ps in p.StockList.Where(x => 
                 x.ColorCode == "10" && 
                 x.PackageLength == 30.64))
        {
            for (int i = 1; i <= ps.OnOrder; i++)
            {
                r.TryAddPackage((IPackage)ps);
            }
        }
ParseExcel pe=new ParseExcel();
Pinnacle p=pe.ParsePinnacleExcel();
机架r=新机架(20,2,4.5,96,42,6,25*12);
foreach(p.StockList中的PinnacleStock ps.Where(x=>
x、 颜色代码==“10”和
x、 包装长度==30.64))
{

对于(inti=1;i,则需要实现并替换

r.TryAddPackage((IPackage)ps);

由您决定如何填充它返回的
PinnacleStock
的新实例

在最基本的层面上,你可以说

public PinnacleStock : ICloneable {
    public PinnacleStock Clone() {
        return (PinnacleStock)this.MemberwiseClone();
    }
    object ICloneable.Clone() {
        return Clone();
    }
    // details
}

这将只做
PinnacleStock
的一个浅拷贝。只有你知道这是否是你域的正确语义。

你必须提供逻辑来自己拷贝对象。.Net没有任何内置的深度拷贝(值得注意的潜在例外是序列化)。最接近它的是MemberwiseClone()方法,但即使这样,也会复制类型中任何成员本身为引用类型的引用。

如果您只需要浅拷贝,则可以编写快速修复克隆方法:

public class PinnacleStock : ICloneable
{
    public PinnacleStock Clone()
    {
        return (PinnacleStock)this.MemberwiseClone();
    }

    object ICloneable.Clone()
    {
        return Clone();
    }

    // Other methods
}

如果您需要深度复制(即如果
PinnacleStock
也有您想要复制的子对象),那么您需要自己编写一个。

正如其他人所说,您需要以特定于PinnacleStock的方式进行复制:

foreach (PinnacleStock ps in p.StockList.Where(x => x.ColorCode == "10" && 
                                                    x.PackageLength == 30.64))
{
  for (int i = 1; i <= ps.OnOrder; i++)
  {
    PinnacleStock clone = ps.CopySomehow();  // your problem
    r.TryAddPackage((IPackage)clone);
  }
}
foreach(p.StockList.Where(x=>x.ColorCode==“10”&&
x、 包装长度==30.64))
{

对于(int i=1;i)应该如何复制对象?如果您得到的是相同的IPackage,那么在Pinnacle.StockList中有许多相同的PinnacleStock。如果是这种情况,那么请遵循关于iClonable的答案。如果这不是您所期望的,那么问题在于ParseExcel.ParsePinnacleExcel()方法,特别是将相同的对象一次又一次地放在库存列表中。重复这篇文章对iClonable和其他实现的优缺点进行了充分的讨论。我真的很欣赏多个用户如何从彼此的答案中获得解决此问题的可靠方案。干得好!FWIW,我不会选择clo这是因为
Copy
Clone
在术语上存在差异。我使用了错误的术语,也许其他这样做的人会觉得这很有帮助。请注意,
MemberwiseClone
是一种
受保护的
方法。它不可公开访问。因此,除非您隐藏base方法
MemberwiseClone
并声明一个
public
方法
MemberwiseClone
@Jason我注意到它没有编译。但是,“隐藏基本方法…并声明一个public方法”是什么意思?我想我找到了答案:@Ben McCormack:嗯,你真的不应该这样做,但你可以说
public new PinnacleStock MemberwiseClone(){return(PinnacleStock)base.MemberwiseClone();}
。如果您认为
MemberwiseClone
将解决您需要解决的问题,那么最好说
public PinnacleStock Clone(){return(PinnacleStock)this.MemberwiseClone();}object iclonable.Clone(){return Clone();}
我会在我的原始答案中详细说明这一点。@Jason:你说得对,我不知道我是怎么漏掉的。我在类中使用了一个公共方法重写了它。这非常有效。作为对其他建议的认可,对于浅层克隆,你可以使用
MemberwiseClone()
。但是,由于它受保护,您必须在要克隆的对象的实际类中实现它。我是这样做的:
public object Clone(){return(PinnacleStock)this.MemberwiseClone();}
@Ben McCormack:对。您可以更进一步,声明一个方法
Clone
,该方法返回
PinnacleStock
,并显式实现
IClonable.Clone
。请参见我的编辑。
foreach (PinnacleStock ps in p.StockList.Where(x => x.ColorCode == "10" && 
                                                    x.PackageLength == 30.64))
{
  for (int i = 1; i <= ps.OnOrder; i++)
  {
    PinnacleStock clone = ps.CopySomehow();  // your problem
    r.TryAddPackage((IPackage)clone);
  }
}