我遇到问题是列表中的对象的引用丢失了,这就是我详细阐述代码的方式:
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
方法。
答案 0 :(得分:4)
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
相同的课程,但不应该使用结构。
答案 1 :(得分:2)
你写了一个"对象的引用"丢失,但struct
没有"参考"它。
struct
具有值类型语义。因此,当您使用=
进行分配时,会生成右侧的副本。你这样做:
myProperties[0] = objProperty;
此复制值,并将副本放在数组的第0个条目中。
如果您以后修改"原始"实例objProperty
,该更改将不会出现在数组中保存的副本中。
这不是一个阵列问题。所有struct
值赋值都会发生相同的情况。例如:
var objProperty2 = objProperty;
如果之后原始objProperty
发生了变异,则复制的值objProperty2
将不受影响。请参阅示例C# Reference type assignment VS value type assignment。
有些人认为可变的结构是邪恶的。