C# 修改ArrayList中的对象成员
我正在制作一个Bar对象的ArrayList。然后我希望能够修改ArrayList中包含的BarType成员。我创建了一个缩短版的代码,它实际上正在做我希望它做的事情,但我不明白它为什么要这样做 在代码中,我创建了两个Bar对象并将它们填充到ArrayList中。我从列表中拉出最后一个Bar对象,将其强制转换为Bar。但是TMP是BAR对象的一个新实例,但是当我更改TMP中的值时,它会更改arraylist中的值。我不知道它为什么这样做,或者这是否是更改ArrayList中BarType值的最佳方法 代码如下:C# 修改ArrayList中的对象成员,c#,arraylist,C#,Arraylist,我正在制作一个Bar对象的ArrayList。然后我希望能够修改ArrayList中包含的BarType成员。我创建了一个缩短版的代码,它实际上正在做我希望它做的事情,但我不明白它为什么要这样做 在代码中,我创建了两个Bar对象并将它们填充到ArrayList中。我从列表中拉出最后一个Bar对象,将其强制转换为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
下面是我的酒吧课程:
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;
}
}
但是TMP是BAR对象的一个新实例,但是当我更改TMP中的值时,它会更改arraylist中的值
这是不正确的。如果你在C++中使用了类栏
更改为结构栏
(或实现IClonable
并使用.Clone()
获取新的栏
实例)
这里,您正在堆上创建一个名为tmp
Bar tmp = new Bar(5,6);
但是在这里,您正在使用对barArray
中最后一项的新引用覆盖tmp
中的引用。原始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
等)应该具有标题库
名称以及公共成员(方法、属性等)。局部变量和参数应在camelCase
中。字段也可以是camelCase
或\u下划线预定义的
。任何需要使用ArrayList
而不是List
的原因?对象根本不会传递-默认情况下通过值传递引用。说“类对象是通过引用传递的”是有误导性的。(特别是,它建议对类型为类的参数使用ref
是毫无意义的,但事实并非如此。)参见@JonSkeet“引用按值传递”对初学者来说是一个令人困惑的概念,尽管我们正在讨论英语语义学。我所说的“通过引用传递”是指“通过引用传递”或“分配只是引用”,但我很难找到一种方法来描述这一点,而不是重复使用具有更深层含义的词语,例如“引用”。使用准确的词语,这就是“默认情况下,参数是按值传递的,引用类型变量的值是一个引用”。随着时间的推移,我已经向数百名初学者解释了这个概念,虽然这需要更多的时间(理想情况下是通过真实世界的类比),这比让人们对“通过引用”的含义产生困惑要好得多,以我的经验来看……我必须清理那些被它弄糊涂的人。这不是争论英语语义学的问题,而是正确使用理解良好的计算机科学术语的问题。@JonSkeet我已经重新解释了我的解释。