我正在制作一个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;
}
}
答案 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:只有类型(class
,struct
等)应该有TitleCase
个名称以及公共成员(方法,属性等)。局部变量和参数应该在camelCase
中。字段也应由camelCase
或_underscorePrefixed
自行决定。