繁体   English   中英

按引用或按值C#

[英]c# by reference or by value

假设我有一个对象列表,并且正在像这样从列表中提取和修改项目:

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. 修改新项目,我必须将列表中的原始项目替换为我刚刚修改的项目。

要看。

如果对象列表是类实例的列表,则TheObject变量将保存作为reference的值。 此引用在列表中也仍然存在。 在该参考处对对象的修改将在两者中均可见。 重要警告:覆盖变量中包含的引用(即变量重新分配)将不会保留在列表中,也不会将列表中的引用覆盖到变量中。

如果对象列表是结构实例的列表,则TheObject仅包含value ,并且该值的突变在列表内不可见。

这取决于MyObject是类还是结构。

如果是类,则您正在修改原始对象。
如果是结构,则您正在修改副本。

您正在修改列表中的项目,因为调用将返回对列表中项目的引用,而不是其副本。 另外,您用来创建的对象

MyObject TheObject = new MyObject();

当您将引用更改为新选择的项目时,将被丢弃。 您可以省略该行,然后执行以下操作:

MyObject theObject = (from o in TheListOfObject
         where o.ID == SomeParameter
         select o).SingleOrDefault();

我假设MyObject是一个类,而不是一个结构,因为我们正在通过操作对其进行变异,而可变结构是邪恶的

列表中的项目仅供参考,因此您正在修改同一对象-无需尝试将其复制回列表中,因为它已经存在。

您正在修改列表中的项目 TheObject内存中唯一项的引用

您甚至可以创建多个列表,所有列表都将包含对内存中相同对象的引用。


您的代码有问题:

MyObject TheObject = new MyObject();

...

TheObject = (from o in TheListOfObject
             where o.ID == SomeParameter
             select o).SingleOrDefault();

您首先要创建该对象的新实例,这将对TheObject产生新值。

= new MyObject(); 您的代码的一部分是没有用的。 对于= new List<MyObject>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM