数组中对象的引用未保留

时间:2015-04-01 07:49:29

标签: c# arrays struct reference

我遇到问题是列表中的对象的引用丢失了,这就是我详细阐述代码的方式:

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方法。

2 个答案:

答案 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.Yx2.Y相同的课程,但不应该使用结构。

答案 1 :(得分:2)

你写了一个"对象的引用"丢失,但struct没有"参考"它。

struct具有值类型语义。因此,当您使用=进行分配时,会生成右侧的副本。你这样做:

myProperties[0] = objProperty;

复制值,并将副本放在数组的第0个条目中。

如果您以后修改"原始"实例objProperty,该更改将不会出现在数组中保存的副本中。

这不是一个阵列问题。所有struct值赋值都会发生相同的情况。例如:

var objProperty2 = objProperty;

如果之后原始objProperty发生了变异,则复制的值objProperty2将不受影响。请参阅示例C# Reference type assignment VS value type assignment

有些人认为可变的结构是邪恶的。