[英]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;
我是
要看。
如果对象列表是类实例的列表,则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.