我有一个存储两个字符串的对象并覆盖ToString()方法以返回其中一个字符串
fooBar temp;
foreach (string foo in bar)
{
temp = new fooBar(); <--- Why is this line needed when I
am overwriting the code and path on each cycle before adding?
temp.code += ".";
temp.path += ".";
Console.WriteLine(temp);
clbFooBar.Items.Add(temp);
}
控制台的打印件遵循覆盖的代码和路径字符串值,但是已检查的列表框项目完全相同(最后一个项目的ToString()),基础进程正在进行的是什么& #39; t立刻明显吗?
如果我将其更改为clbFooBar.Items.Add(temp.ToString());
,它的效果绝对正常,但不会与temp.ToString.ToString()
相同,因为.Add
首先调用.ToString()
?我认为控制台打印和.Add
的行为相同,因为它们都会调用ToString()
编辑:temp = new fooBar();
是解决我的问题的方法,我只是想知道为什么当直觉导致我认为覆盖两个字符串,代码和路径时,这就是解决方案,应该足够了,为什么没有这个重新初始化,选中列表框中的所有项目都是相同的。
答案 0 :(得分:3)
因此,如果您保持行
,那么您的问题似乎就是您的代码正常工作的原因temp = new fooBar();
在你的循环中,但是如果你省略这一行,你的CheckedListBox
就会用所有相同的项填充。
原因是,如果你在循环之外创建只有一个 fooBar
实例,那么:
fooBar temp; = new fooBar();
foreach (string foo in bar)
{
temp.code += ".";
temp.path += ".";
clbFooBar.Items.Add(temp);
}
然后您多次添加相同实例,并在每次迭代中更改该实例的属性。
如果您在循环中创建新实例,请执行以下操作:
foreach (string foo in bar)
{
fooBar temp; = new fooBar();
temp.code += ".";
temp.path += ".";
clbFooBar.Items.Add(temp);
}
每次迭代都有一个新实例,并且不会更改已添加的实例。
更新:只是注意到它们看起来仍然与您将它们全部设置为默认值code
和temp
加上"."
相同。所以你还有点不清楚你真正尝试做什么。也许是这样的:
string s = string.Empty;
foreach (string foo in bar)
{
s += ".";
fooBar temp; = new fooBar();
temp.code = s;
temp.path = s;
clbFooBar.Items.Add(temp);
}
答案 1 :(得分:0)
您正在temp
循环之外创建foreach
,然后在其中初始化。
如果你没有重新初始化循环,你最终得到的是CheckedListBox
,其中的所有项目都指向同一个对象。
这就是为什么当你查看列表时你得到最后一个对象的值(因为实际上只有)。
我猜你真正想要做的是将每个项目(foo)添加到CheckedListBox
栏中。如果是这样,请使用它。
foreach (string foo in bar)
{
foo.code += ".";
foo.path += ".";
Console.WriteLine(foo);
clbFooBar.Items.Add(foo);
}