未保留数组中对象的引用
Reference of object in array not kept
我遇到了一个问题,就是对列表中对象的引用丢失了,这就是我详细说明代码的方式:
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
是相同的,但对于结构则不同。
你写的是 "reference to an object" 丢失了,但是 struct
没有 "reference"。
A struct
具有值类型语义。因此,当您使用 =
进行赋值时,会生成右侧的副本。你这样做:
myProperties[0] = objProperty;
此复制值,并将副本放入数组的第 0 个条目。
如果您稍后修改 "original" 实例 objProperty
,该更改将不会出现在数组中保存的副本中。
这不是数组问题。所有 struct
值分配都会发生同样的情况。例如:
var objProperty2 = objProperty;
如果原始 objProperty
之后发生变异,复制的值 objProperty2
将不受影响。例如参见 [=19=].
有些人认为可变结构是邪恶的。
我遇到了一个问题,就是对列表中对象的引用丢失了,这就是我详细说明代码的方式:
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
是相同的,但对于结构则不同。
你写的是 "reference to an object" 丢失了,但是 struct
没有 "reference"。
A struct
具有值类型语义。因此,当您使用 =
进行赋值时,会生成右侧的副本。你这样做:
myProperties[0] = objProperty;
此复制值,并将副本放入数组的第 0 个条目。
如果您稍后修改 "original" 实例 objProperty
,该更改将不会出现在数组中保存的副本中。
这不是数组问题。所有 struct
值分配都会发生同样的情况。例如:
var objProperty2 = objProperty;
如果原始 objProperty
之后发生变异,复制的值 objProperty2
将不受影响。例如参见 [=19=].
有些人认为可变结构是邪恶的。