c#按引用或按值

时间:2012-02-16 15:03:30

标签: c#

假设我有一个对象列表,我正在从列表中提取和修改项目,如下所示:

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;时,我:

  1. 修改列表中的项目,在这种情况下我已完成或
  2. 修改一个新项目,我必须用我刚刚修改过的项目替换列表中的原始项目。

5 个答案:

答案 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>();

也是如此