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

本文关键字:数组 重写 存储 第一个 何使用 | 更新日期: 2023-09-27 18:10:38

嗯,我正在创建一些订阅表单,最多是5个订阅。

所以,我有一个类成员,在类中我使用Get&Set方法的东西(我终于学会了这个Get&Set的东西哈哈&我希望我正确地使用它)。

private string name;
private string address;        
public string Name { get { return name; } set { name = value; } }
public string Address { get { return address; } set { address = value; } } 

在class形式

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

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

你正在改变一个对象状态并将其传递给所有数组项,所以最后你只会在所有数组项中输入最后一个输入,因为它们都引用单个对象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;
  }
 }

你只使用一个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++) {
  ...