gpt4 book ai didi

c# - 将自定义对象添加到 C# 中的选中列表框

转载 作者:太空宇宙 更新时间:2023-11-03 23:13:15 24 4
gpt4 key购买 nike

我有一个对象,它存储两个字符串并覆盖 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()),正在进行的底层过程不是很明显?

如果我将其更改为 clbFooBar.Items.Add(temp.ToString()); 它绝对可以正常工作,但它不会与 temp.ToString.ToString 相同() 因为 .Add 首先调用了 .ToString()?我认为控制台打印和 .Add 的行为相同,因为它们都调用 ToString()

编辑:temp = new fooBar(); 是解决我的问题的方法,我只是想知道为什么这是解决方法,直觉让我认为覆盖两个字符串,代码和路径,应该足够了,为什么没有重新初始化,选中列表框中的所有项目都是相同的。

最佳答案

所以你的问题似乎是,如果你保留这条线,为什么你的代码能正常工作

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);
}

每次迭代都有一个新实例,并且不要更改已添加的实例。


更新:刚刚注意到,当您将它们全部设置为任何默认值 codetemp 时,它们仍然看起来都一样,加上一个 "."。因此,您实际尝试做什么仍然有点不清楚。也许是这样的:

string s = string.Empty;
foreach (string foo in bar)
{
s += ".";
fooBar temp; = new fooBar();
temp.code = s;
temp.path = s;
clbFooBar.Items.Add(temp);
}

关于c# - 将自定义对象添加到 C# 中的选中列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38225613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com