更改对象列表中的一个元素属性值也会更改所有元素值

时间:2015-11-02 15:15:34

标签: c# list oop

这是我的班级名为" Objek"。

public class Objek
{
    public int id;
    public int tipe;
    public int bentuk;
    public List<int> x { get; set; }
    public List<int> y { get; set; }
    public int xC { get; set; }
    public int yC { get; set; }
    public Color Warna { get; set; }
    public Objek()
    {
        this.Warna = Color.Black;
        this.x = new List<int>();
        this.y = new List<int>();
    }
    public Objek(int tipe, int bentuk)
    {
        this.tipe = tipe;
        this.bentuk = bentuk;

        this.Warna = Color.Black;
        this.x = new List<int>();
        this.y = new List<int>();
    }
}

然后在form1.cs中我全局声明(在任何方法之外):

Objek temp = new Objek();

输入&#34; temp&#34;的值后,我将其存储到List:

<{> List<Objek> Objek = new List<Objek>();Objek.Add(temp); 问题是每当我在存储超过1&#34; temp&#34;之后我改变了一个元素的属性值(例如:Objek[0].Warna = Color.Red)。对象,所有Objek[0, 1, ..., n].Warna也更改为红色。

有人能解释一下我在这些代码中的错吗?

3 个答案:

答案 0 :(得分:1)

听起来您正在向List添加相同的对象引用。在方法中移动Objek temp = new Objek();,以便每次都创建一个新对象,否则每次调用此方法时,它都使用/添加相同的对象

enter image description here

答案 1 :(得分:0)

听起来你正在存储对同一个对象的多个引用。

答案 2 :(得分:0)

您要多次插入同一个对象,因此您只有1个对象多次插入列表,因此更改一个会全部更改。您应该复制对象或创建多个。这可以使用ICloneable https://msdn.microsoft.com/en-us/library/system.icloneable(v=vs.110).aspx,像AutoMapper http://automapper.org/这样的库来完成,或者只是创建一个新对象。