更新子类中的对象不会更新基类</t>中List <t>中的对象

时间:2012-03-03 19:13:58

标签: c# list pass-by-reference

我有以下课程:

public class DrawableComplexEntity2D
{
    public List<GameComponent> Components { get; set; }

    // anothers properties, constructor, methods...
}

public class BoardCell : DrawableComplexEntity2D
{
    public GoalPersonGroup GoalPersonGroup { get; set; }

    public void CreateGoalPersonGroup(Goal groupType)
    {
        this.GoalPersonGroup = new GoalPersonGroup(groupType)
        base.Components.Add(this.GoalPersonGroup);
    }
}

所以,当我这样做时:

BoardCell cell1 = new BoardCell();
cell1.CreateGoalPersonGroup(Goal.Type1);

BoardCell cell2 = new BoardCell();
cell2.CreateGoalPersonGroup(Goal.Type2);

cell1.GoalPersonGroup = cell2.GoalPersonGroup;

当我用cell2.GoalPersonGroup更新cell1.GoalPersonGroup时,更新了cell1.GoalPersonGroup,但是在cell1的base.Components内部的cell1.GoalPersonGroup没有改变,仍然是cell1的值而不是cell2。为什么呢?

3 个答案:

答案 0 :(得分:2)

是的,你对引用感到困惑。分配引用变量会指定引用的东西。

例如

string str1 = new String("Hello");   //str1 has a reference to "Hello"
string basestr = str1;               //basestr has a reference to "Hello" (NOT str1)

string str2 = new String("Goodbye"); //str2 has a reference to "Goodbye"
str1 = str2;                         //str1 has a reference to "Goodbye" (basestr still = hello)

答案 1 :(得分:1)

与所有其他变量一样,列表包含。使用引用类型(我假设GoalPersonGroup是),引用。如果我有以下内容:

object a = ...;
object b = ...;

a = b;

我所做的就是获取b(这是一个参考)并将该值复制到a。对于引用类型,我可以执行 on 该值的操作(如调用a.SomeProperty = "foo";),并且状态中的相同更改将反映在程序中存储该特定引用的任何位置在变量中。换句话说,如果我要检查b.SomeProperty的值,它将是"foo"

但是,更改变量中的值不会影响指向该值的其他变量(ref参数除外)。

您添加了一个指向List引用的值。您还为属性分配了相同的值。这两个不同的内存位置包含相同的值,因此指向相同的实际对象。但是稍后你只是重新分配属性的值,这意味着它现在具有不同的值,而不是列表中存储的值。

答案 2 :(得分:0)

您只更改了属性cell1.GoalPersonGroup中的引用,而不是已添加到base.Components的引用。要解决此问题,您必须在GoalPersonGroup的设置器中添加代码才能执行您想要的操作。