Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改ArrayList中的对象成员_C#_Arraylist - Fatal编程技术网

C# 修改ArrayList中的对象成员

C# 修改ArrayList中的对象成员,c#,arraylist,C#,Arraylist,我正在制作一个Bar对象的ArrayList。然后我希望能够修改ArrayList中包含的BarType成员。我创建了一个缩短版的代码,它实际上正在做我希望它做的事情,但我不明白它为什么要这样做 在代码中,我创建了两个Bar对象并将它们填充到ArrayList中。我从列表中拉出最后一个Bar对象,将其强制转换为Bar。但是TMP是BAR对象的一个新实例,但是当我更改TMP中的值时,它会更改arraylist中的值。我不知道它为什么这样做,或者这是否是更改ArrayList中BarType值的最佳

我正在制作一个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++中使用了或值类型/复制构造函数,但在C·./Net中,所有<<代码>类< /Cord>对象都是堆分配和引用的引用,而这些引用又是通过值传递的(也就是说,引用是按值传递的)。 要获得预期的分配时复制行为,请将
类栏
更改为
结构栏
(或实现
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我已经重新解释了我的解释。