C# 数组中对象的引用未保留
如果列表中对对象的引用丢失,我会遇到一个问题,我就是这样详细阐述我的代码的:C# 数组中对象的引用未保留,c#,arrays,struct,reference,C#,Arrays,Struct,Reference,如果列表中对对象的引用丢失,我会遇到一个问题,我就是这样详细阐述我的代码的: PropertyObject[] myProperties = new PropertyObject[200]; var objParent = new Parent(); var objProperty = new PropertyObject(); myProperties[0] = objProperty; objParent.property = myProperties[0]; 现在,当我修改objPar
PropertyObject[] myProperties = new PropertyObject[200];
var objParent = new Parent();
var objProperty = new PropertyObject();
myProperties[0] = objProperty;
objParent.property = myProperties[0];
现在,当我修改objParent.property
时,它不会修改myProperties
数组中的对象,有什么解决方法吗?我需要这个,这样我就不必迭代数组了
以下是我修改对象的方式:
public void modifyObject(ref Parent objectToModify) {
objectToModify.property.isThisCrazy = true;
}
然后我只调用
modifyObject
方法。struct
s是不可变的。将struct
分配给另一个变量将导致复制struct
在一个实例上指定属性时,struct
的另一个实例的属性不会更改。因此,在其他引用中看不到更新
演示结构问题的示例代码:
struct X
{
public string Y { get; set; }
public X(string y) : this()
{
Y = y;
}
}
X x = new X("abc");
X x2 = x;
x2.Y = "def";
Console.WriteLine(x.Y);
Console.WriteLine(x2.Y);
对于类,您希望x.Y
和x2.Y
是相同的,但与结构不同。您编写的“对对象的引用”丢失,但struct
没有对它的“引用”
struct
具有值类型语义。因此,当您使用=
进行赋值时,将生成右侧的副本。你可以:
myProperties[0] = objProperty;
这将复制该值,并将副本放入数组的第0个条目中
如果以后修改“原始”实例objProperty
,则该更改将不会出现在阵列中保存的副本中
这实际上不是一个数组问题。所有struct
值赋值也会发生同样的情况。例如:
var objProperty2 = objProperty;
如果原始的objProperty
随后发生变异,则复制的值objProperty2
将不受影响。例如,见
有些人认为可变结构是邪恶的。
什么是<代码>属性对象< /代码>?它是一个保存对象的某些特性的代码<代码> Objor < /代码>不在数组中,那么如果修改<代码> Objuts<代码>,为什么数组会改变?“那么我只调用modifyObject函数”Where?结构是值类型。若要使其成为引用类型,请将其更改为classStructs,因为它不是固有不变的。它们的复制语义使得可变结构难以使用。因此,建议它们是不可变的,但很可能有可变的结构。@mikez:同意。更新了第一句。你:事实上,你正在创建一个属性/字段设置的新实例。否。新实例是在将结构分配给另一个变量(或将其作为值参数传递给方法,或将其装箱)时创建的。在您的示例中,行x2=X代码>创建一个新实例。设置属性Y
的值不会创建结构的新实例@杰佩斯蒂格尼尔森:你是对的。谢谢你指出这一点。更新了我的帖子。