嗯,我正在创建一些订阅表单,最多是5个订阅。
所以,我有一个班级成员,在课堂上我使用了Get& Set方法(我终于知道这个得到和设置的东西哈哈&我希望我&m;正确使用它。)
private string name;
private string address;
public string Name { get { return name; } set { name = value; } }
public string Address { get { return address; } set { address = value; } }
在课堂表格中
Member[] memberArray = new Member[5];
Member memberSub = new Member();
BtnAdd_Click
memberSub.Name = TbName.Text;
memberSub.Address = TbAddress.Text;
for (int i = 0; i < memberArray.Length; i++)
{
if (memberArray[i] == null)
{
memberArray[i] = memberSub;
MessageBox.Show(TbName.Text + " has been added as a subscriber.");
break;
}
}
当我点击显示时,它会显示最后一个输入,并且前面的输入会丢失,idk为什么会发生这种情况并且出现错误?我认为它是空数组数据的原因,但我不确定。
除非我的显示按钮代码有问题..?
for (int i = 0; i < memberArray.Length; i++)
{
rtbDisplay.Text += "Name: " + memberArray[i].Name + Environment.NewLine
+ "Address: " + memberArray[i].Address + Environment.NewLine
"----------------------------------------------------"
+ Environment.NewLine;
}
答案 0 :(得分:2)
您正在更改一个对象状态并将其传递给所有数组项,因此最后您将只在所有数组项中输入最后一个输入,因为它们都指向单个对象memberSub
和其他数组项目也有memberSub
引用,因此它们将显示相同的结果,您需要单独实例化数组的每个对象,然后设置它们的属性,如下所示:
for (int i = 0; i < memberArray.Length; i++)
{
if (memberArray[i] == null)
{
memberArray[i] = new Member();
memberArray[i].Name = TbName.Text;
memberArray[i].Address = TbAddress.Text;
MessageBox.Show(TbName.Text + " has been added as a subscriber.");
break;
}
}
答案 1 :(得分:1)
您只使用一个Member
实例,因此最终会得到一个充满对同一实例的引用的数组。将对象分配给数组时,它只是存储的引用,它不会创建要存储在数组中的对象的副本。
不是使用单个Member
实例,而是每次要将其存储在数组中时创建一个新实例。
只需声明对象的引用:
Member memberSub;
然后当你需要使用一个时,创建一个新的:
memberSub = new Member();
memberSub.Name = TbName.Text;
memberSub.Address = TbAddress.Text;
您可以考虑使用列表而不是数组:
List<Member> memberList = new List<Member>(5);
将项目添加到列表中会更容易。您只需跟踪列表的长度即可。类似的东西:
if (memberList.Count < 5) {
memberList.Add(memberSub);
} else {
MessageBox.Show("No more members allowed.");
}
显示成员时,只需遍历列表中的所有项目。由于列表中没有空项,因此您无需跳过任何项目。您可以在访问数组中的项目时访问列表中的项目。唯一的变化是列表的大小位于Count
属性中,您对该数组使用Length
:
for (int i = 0; i < memberArray.Count; i++) {
...