假设我有一个对象列表,我正在从列表中提取和修改项目,如下所示:
List<MyObject> TheListOfObjects = new List<MyObject>();
MyObject TheObject = new MyObject();
TheListOfObjects = //some json deserialization result
TheObject = (from o in TheListOfObject
where o.ID == SomeParameter
select o).SingleOrDefault();
TheObject.SomeProperty = SomeValue;
当我写TheObject.SomeProperty = SomeValue;
时,我:
答案 0 :(得分:6)
取决于
如果对象列表是类实例列表,则TheObject
变量将保存一个引用的值。该引用也将存在于列表中。两者中都可以看到该参考对象的修改。重要提示:写入变量中包含的引用(即变量重新分配)将不会持久保存到列表中,写入列表中的引用也不会持久存储到变量中。
如果对象列表是结构实例列表,则TheObject
只包含值,并且该值的突变在列表中不可见。
答案 1 :(得分:5)
这取决于MyObject
是一个类还是一个结构。
如果是类,则修改原始对象 如果它是一个结构,你就是在修改一个副本。
答案 2 :(得分:1)
您正在修改列表中的项目,因为调用会返回对列表中项目的引用,而不是它的副本。此外,您使用
创建的对象MyObject TheObject = new MyObject();
当您更改对新选择项目的引用时,就会被丢弃。您可以省略该行,然后执行:
MyObject theObject = (from o in TheListOfObject
where o.ID == SomeParameter
select o).SingleOrDefault();
我假设MyObject是一个类,而不是结构,因为我们正在使用该操作对其进行变异,并且mutable structs are evil
答案 3 :(得分:1)
列表中的项目是通过引用保留的,因此您正在修改同一个对象 - 无需尝试将其复制回列表,因为它已经存在。
答案 4 :(得分:1)
您正在修改列表中的项目。 TheObject
是内存中唯一商品的参考。
您甚至可以创建多个列表,所有列表都将包含对内存中相同对象的引用。
您的代码有问题:
MyObject TheObject = new MyObject();
...
TheObject = (from o in TheListOfObject
where o.ID == SomeParameter
select o).SingleOrDefault();
您首先要创建一个对象的新实例,影响TheObject
一个新值。
代码的= new MyObject();
部分无用。 = new List<MyObject>();