我有一个DocumentList.c,如下所示。当我尝试将一个列表添加到DocumentList对象的实例中时,它会添加但其他的是相同的
class DocumentList { public static List wordList; public static string type; public static string path; public static double cos; public static double dice; public static double jaccard; //public static string title; public DocumentList(List wordListt, string typee, string pathh, double sm11, double sm22, double sm33) { type = typee; wordList = wordListt; path = pathh; cos = sm11; dice = sm22; jaccard = sm33; } }
在主c#代码片段
中public partial class Window1 : System.Windows.Window { static private List documentList = new List(); ...
在我使用的方法中。
DocumentList dt = new DocumentList(para1, para2, para3, para4, para5, para6); documentList.Add(dt);
现在,当我添加第一个列表时,它似乎是documentList中的1个项目,但是对于第二个列表,我得到一个包含2个项目的列表,但两者都相同..
我的意思是我不能保留以前的列表项..
答案 0 :(得分:4)
使用通用List<T>
代替,它会更容易阅读和理解,并且性能会降低很多(有关泛型的更多内容,请阅读this):
class DocumentList
{
//via a (non-static - read link below) field:
public List<string> wordList;
//via a property (read link below):
public List<string> WordList { get; set; }
//----------
public DocumentList(List<string> wordList, .....
{
//Sets property
this.WordList = wordList;
//Sets field
this.wordList = wordList;
//etc.
}
}
private partial class Window1
{
private List<DocumentList> documentList = new List<DocumentList>();
}
this
关键字引用当前实例(即DocumentList
类中声明的成员)。
我不明白的是,为什么你要将所有成员声明为静态,如果它是不可变的,那么你应该将它声明为readonly
,一旦你将你的字段标记为静态,它们在所有实例之间共享,因此列表中变量项的值实际上指的是与它共享的值相同的值,一旦更新成员,它就会更新“共享”字段,并且您在所有实例中看到相同的值田野。
我强烈建议您阅读this。
另一个好主意是用properties包裹你的字段。
答案 1 :(得分:3)
您在第一个实例中覆盖值的原因是您已将所有字段标记为static
。静态字段,属性和方法在类的所有实例之间共享。
除此之外,使用List<string>
并避免不得不来回演绎。
答案 2 :(得分:2)
问题是您已将所有类成员声明为静态。这意味着您的所有实例将共享相同的值,并且对一个对象的修改也会影响所有其他实例。删除static关键字,以便每个实例都有自己的数据。
class DocumentList
{
public List wordList;
// etc...
另外,作为一种风格问题,你不应该有公共领域。要么将它们设为私有,要么将它们变成属性。您可能还想考虑只公开吸气剂。