我如何使用类数组,以便它不会重写存储的第一个数组?

时间:2014-06-29 09:54:35

标签: c# arrays visual-studio-2010 oop loops

嗯,我正在创建一些订阅表单,最多是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;
} 

2 个答案:

答案 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++) {
  ...