修改ArrayList中的对象成员

时间:2015-03-02 22:24:08

标签: c# arraylist

我正在制作一个Bar Object的ArrayList。然后,我希望能够修改ArrayList中包含的BarType成员。我创建了一个缩短版本的代码,实际上正在做我想做的事情,但我不明白它为什么要这样做。

在代码中我创建了两个Bar对象并将它们填充到ArrayList中。我将最后一个Bar Object从列表中拉出来,然后将其转换为Bar。但是TMP是BAR对象的新实例,但是当我更改TMP中的值时,它会更改我的arraylist中的值。我不确定它为什么会这样做,或者这是否是更改ArrayList中BarType值的最佳方法。

以下是代码:

ArrayList barArray = new ArrayList();

Bar myBar = new Bar(10,20);

barArray.Add(myBar); // I want to create and keep adding Bar object to my arraylist

myBar = new Bar(30, 40);

barArray.Add(myBar);

Bar tmp = new Bar(5,6);
tmp = (Bar)barArray[myBar];  // extracting the last Bar Object
tmp.BarType = true;
tmp.High = 100;              // too my surprise this change the value in the ArrayList

以下是我的Bar类:

public class Bar 
{
    public double High, Low;
    public bool BarType;      // I want to be able to modify this variable

    public Bar(double Low, double High)
    {
        this.Low = Low; this.High = High;
    }
}

1 个答案:

答案 0 :(得分:2)

  

但是TMP是BAR对象的一个​​新实例,但当我更改TMP中的值时,它会改变我的arraylist中的值

这是不正确的。如果您在C ++中使用struct Bar或value-types / copy-constructors,则会出现这种情况,但在C#/ .NET中,所有class对象都是堆分配的,并通过引用引用, turn按值传递(也就是说,引用按值传递)。

要获得您期望的分配时复制行为,请将class Bar更改为struct Bar(或实施IClonable并使用.Clone()获取新的Bar 1}}实例)。

在这里,您要在堆上创建Bar的新实例,由名为tmp

的引用访问
Bar tmp = new Bar(5,6);

但是,在这里,您使用tmp中最后一项的新引用覆盖barArray中的引用。 原始 tmp Bar实例没有指向它的引用,并且将被垃圾收集。

tmp = (Bar)barArray[c];

tmp现在是BarArray中项目的引用(实质上是别名):

tmp.BarType = true;
tmp.High = 100;

......相当于:

barArray[c].BarType = true;
barArray[c].High = 100;

另外,protip:只有类型(classstruct等)应该有TitleCase个名称以及公共成员(方法,属性等)。局部变量和参数应该在camelCase中。字段也应由camelCase_underscorePrefixed自行决定。