0

为什么此代码导致 shipping.Items.Count 和 combinedShipment.Items.Count 都为零?

private static InboundShipment CombineLikeIsbns(InboundShipment shipment)
{
    // shipment.Items has a count of 3

    var distinctIsbns = shipment.Items.Select(i => i.ISBN).Distinct().ToList();

    var combinedShipment = shipment;
    combinedShipment.Items = new List<InboundShipmentItem>();

    // Now both combinedShipment and shipment have an empty List in the .Items property

    ...

    return combinedShipment;
}

[编辑] 当我将 combineShipment.Items 设置为相同时,我该怎么做才能避免将 shipping.Items 设置为新列表?

4

3 回答 3

5

这个说法:

var combinedShipment = shipment;

将 的值复制shipmentcombinedShipment。假设InboundShipment是一个类,它的值shipment是一个引用——而不是一个对象本身。

所以现在我们有两个变量都引用同一个对象。使用哪个变量来更改对象并不重要 - 更改将通过两个变量可见。

如果要创建原始对象的新“副本”,则必须明确地执行此操作。很难确切知道您需要在这里做什么,因为您没有向我们提供有关该InboundShipment类型的太多信息。

有关更多详细信息,请参阅我关于值类型和引用类型的文章。请注意,这是 C# 和 .NET 的重要组成部分,在继续深入之前,您应该对它充满信心 - LINQ(及其 lambda 表达式、延迟执行等)等高级主题在您掌握之前很难理解很好地掌握基础知识。

于 2012-08-22T16:06:19.397 回答
1

线

var combinedShipment = shipment; 

将 combineShipment 引用设置为指向与货件相同的实例。因此,当您清除 combineShipment 上的项目时,它会为该单个实例清除它们。

于 2012-08-22T16:07:10.700 回答
1

赋值var combinedShipment = shipment;导致combinedShipmentandshipment引用完全相同的对象。这有点像在同一个纸板箱上贴两个不同的标签。

因此,将所有物品从标有标签的框中取出的下一行combinedShipment也会导致标有标签的框shipment被清空。因为它们只是带有两个不同标签的同一个盒子。

如果您想创建一个包含不同项目的新货件对象,您需要首先执行以下操作:创建一个新货件对象。

var combinedShipment = new InboundShipment();

实际的代码可能看起来不完全一样。假设您希望combinedShipment' 的某些属性与 ' 相同shipment,则必须手动确保发生这种情况。根据InboundShipment设计方式,这将需要将所需的值传递给构造函数,通过属性设置所需的值,或者两者兼而有之。

于 2012-08-22T16:10:17.050 回答