2012-09-14 35 views
1

我最近遇到了一个麻烦,在我的程序中,使用用户定义的类的列表一直在破坏数据。例如:使用自定义类的列表

class myClass { 
    public int x; 
} 

myList<myClass> = new List<myClass>(); 
myClass myObject = new myClass(); 

myList.Add(myObject); 
myList.Remove(myObject); 

当我尝试向列表添加内容时,我的数据被破坏。我相信删除对象也会导致问题,但这可能是因为它们首先被损坏。我见过类似的问题herethere,并希望有人能向我解释发生了什么事。虽然这些链接确实为我提供了一些答案,但他们并没有很好地解释幕后发生的事情。

编辑:我应该更清楚我的数据如何被损坏。添加到列表中时,我的对象字段中的值将被更改。对于我的程序来说,这些值应该都是0或1,但是当添加到列表时,请将其更改为-1到3.

编辑2:问题的来源与C#不熟悉。我从C++背景出发,假定对象是按值传递的,而不是通过引用传递的。将我的自定义类从类更改为结构立即解决了问题。感谢@MattW!

+3

数据被破坏的方式是什么? –

+0

从链接看起来你试图检查列表中的“Contains”,你没有得到期望的结果?如果是这种情况,请将其添加到您的问题中,“数据损坏”并不是告诉我们您的问题是什么 – Habib

+0

是您的数据损坏或更改? –

回答

4

没有太多在这里去 - 所以下面是一个猜测的问题...

你将它添加到List<>后改变myObject价值?请记住,由于您正在将Class添加到列表(并且所有类都是引用类型),因此如果在将其添加到列表中后将其值更改为myObject,它将在任何地方更改(包括您的List<>的内部)。

例如:

List<myClass> myList = new List<myClass>(); 
myClass myObject = new myClass(); 
myObject.x = 5; 

myList.Add(myObject); 
Console.WriteLine(myList[0].x); //this will be 5 

myObject.x = 7; 
Console.WriteLine(myList[0].x); //this will be 7 

即使你没有碰List<>本身,你改变了引用对象的价值,所以它改变无处不在它被引用。

结帐Value vs Reference types

+0

我应该仔细阅读一下。我来自C++的世界,在这个世界里,这已经被作为一个值而不是一个参考传递给参数。看起来我需要阅读C#和C/C++之间的差异。非常感谢! – Max

+0

我不知道我是否应该删除此文章或将其保留以防其他人犯相同的错误。我无法想象这篇文章将针对目前状态下的正确受众。 – Max

+0

很高兴这有帮助! – MattW