我会尽量简短。
我有一个名为Error
的课程。此类包含名为Suggestions
的属性,它是ObservableCollection<string>
。
在一种方法中,我使用LINQ语句创建了一个名为Error
的{{1}}列表,然后对该列表进行了AllInstances
循环。在循环内部,我向foreach
对象的Suggestions
集合中添加了一项。
问题是,在循环的每一圈,该项目都会添加到Error
的所有成员中。因此,如果循环有3圈,则AllInstances
的每个成员将添加3个项!
正常的行为应该是,每个AllInstances
集合都添加了1个项目,而不是3个。
代码如下:
错误类别
Suggestions
方法代码
public class Error : INotifyPropertyChanged, ICloneable
{
public ObservableCollection<string> Suggestions { get; set; }
}
这对我来说似乎很不合逻辑,以至于我高度怀疑这是我已经做过的事情,还是关于我尚不知道的类型结构的一些基本知识。
感谢您的帮助。谢谢。
答案 0 :(得分:1)
好的,正如我在对该问题的最后评论中提到的那样,我研究了在某些需要的情况下克隆Error
类的方式。原来我是在方法中像这样克隆对象:
public object Clone ()
{
return new Error
{
...
Suggestions = Suggestions,
...
};
}
我注意到Error
类的其他所有属性都是默认类型(不可变?),例如string
,int
和bool
,唯一不同的是类型为ObservableCollection<string>
的建议集合。我发现也许是因为其他属性都表现正确,并且没有引起引用同一实例的问题,所以该集合在设计上不同于其他实例,需要手动重新进行实例化。所以我做到了:
public object Clone ()
{
return new Error
{
...
Suggestions = new ObservableCollection<string>(Suggestions),
...
};
}
我只是在Clone
方法中重新创建了属性,并且解决了在foreach循环中引用同一实例的问题。
我希望对代码有更深入了解的人能启发我和其他可能对此有所了解的人,让他们了解此问题的逻辑以及这些不变类型与ObservableCollection
之间的区别。