我如何使用类数组,使它不重写存储的第一个数组
本文关键字:数组 重写 存储 第一个 何使用 | 更新日期: 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++) {
...