-2

这是我的班级声明:

    List<Carton> Cartons = new List<Carton>();
    public class Carton
    {
        public string CartonLabel;
        public string PN;
        public List<string> Serials;            
    }

这是一个通用列表,我将在最后将其分配给 Carton.Serials

    List<string> Serials = new List<string>();

为什么当我这样做时 Carton.Serials 变成空的:Serials.Clear()

    if (Serials.Count > 0)
                        {
                            Carton CartonItem = new Carton();
                            CartonItem.CartonLabel = CartonData;
                            CartonItem.PN = PNData;
                            CartonItem.Serials = Serials;
                            Cartons.Add(CartonItem);
                            Serials.Clear();
                        }
4

5 回答 5

7

您分配SerialsCartonItem.Serials. 这不会创建副本。它仍然是同一个列表,两个变量都指向同一个实例。

如果要创建副本,可以调用ToList()

CartonItem.Serials = Serials.ToList();

确保添加using System.Linq;到 *.cs 文件的顶部。

于 2013-05-03T15:14:53.433 回答
1

因为从指向同一实例Clear()的泛型中删除所有项目。List<T>

于 2013-05-03T15:14:34.520 回答
1

确实是正确的。clear()从列表中删除项目Clear() MSDN 说。集合元素对其他对象的引用也被释放。

Count 设置为 0,并且从集合元素中对其他对象的引用也被释放。容量保持不变。要重置列表的容量,请调用 TrimExcess 方法或直接设置容量属性。减小容量会重新分配内存并复制 List 中的所有元素。修剪空列表会将列表的容量设置为默认容量。此方法是一个 O(n) 操作,其中 n 是 Count。

于 2013-05-03T15:15:03.800 回答
1

因为当你说 CartonItem.Serials = Serials; 它共享相同的对象。

如果要保留值,则遍历 Serials 并将每个值添加到 CartonItem.Serials

于 2013-05-03T15:16:51.813 回答
0

CartonItem.Serials是参考Serial!所以如果你清除一个,你(似乎)清除另一个,因为它是同一个实例(而不是另一个)。顺便说一句,引用类型和值类型之间的区别是 C# 中最基本的事情之一......

于 2013-05-03T15:14:58.137 回答