如何在类的数组中设置类值

本文关键字:设置 数组 | 更新日期: 2023-09-27 18:24:42

我正在使用Visual Studio创建一个Windows Forms C#项目,并试图设置一个类型类的数组,并使数组中的条目与该类的构造函数字符串相对应。我使用的是一个带有变量索引的数组,每当向数组中添加新的类实例时,索引就会增加。

我遇到了索引调用超出数组范围的问题。此外,我不确定是否为每个实例设置了类变量。有人能给我指正确的方向吗?以下是我的代码:

public partial class MainMenu : Form
{
    //int that will be used to alter the index of the array
    public static int acctcount = 1;
    //array of class Account
    Account[] accounts = new Account[acctcount];
    public MainMenu()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        //check through each element of the array
        for (int i = 0; i < accounts.Length; i++)
        {
            string stringToCheck = textBox1.Text;
            foreach(Account x in accounts)
            {
                //check to see if entered name matches any element in the array
                if (x.Name == stringToCheck)
                {
                    //set variables in another form so that we are using the class variables for only that class
                    Variables1.selectedAccount = x.Name;
                    //is this calling the CheckBalance of the instance?
                    Variables1.selectedCheckBalance = Account.CheckBalance;
                    //same thing?
                    Variables1.selectedSaveBalance = Account.SaveBalance;
                    //switch to form
                    AccountMenu acctMenu = new AccountMenu();
                    this.Hide();
                    acctMenu.Show();
                }
                else
                {
                    /*insert new instance of Account
                    the index element should be 0, since acctcount is set to 1
                    and we are subtracting 1 from the acctcount
                     we are using the string from the textbox1.Text as the constructor
                     for the new instance*/
                    accounts [acctcount-1] = new Account(stringToCheck);
                    //increase the index of the array by 1
                    acctcount += 1;
                }
            }
        }
    }
}
class Account
{
    private string name;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
    private static int acctNum = 0;
    public static int AcctNumber
    {
        get
        {
            return acctNum;
        }
        set
        {
            acctNum = value;
        }
    }
    //initialize the CheckBalance value to 100.00
    private static decimal checkBalance = 100.00M;
    public static decimal CheckBalance
    {
        get
        {
            return checkBalance;
        }
        set
        {
            checkBalance = value;
        }
    }
    public Account(string Name)
    {
        this.Name = Name;
    }
    private static decimal saveBalance = 100.00M;
    public static decimal SaveBalance
    {
        get
        {
            return saveBalance;
        }
        set
        {
            saveBalance = value;
        }
    }
}

如何在类的数组中设置类值

报告的异常的问题[很可能]是行accounts[acctcount-1],因为当acctcount>=2(例如accounts[1])时,它将抛出IndexOutOfBounds异常,就像第一次单击按钮并递增acctcount之后发生的那样。然而,数组只有一个元素,因为它是用C#中的accounts = new Account[acctcount];-数组创建的,而不是用growt/resize

最简单、最好的即时修复方法是使用List(请参见Collections(C#))而不是数组;列表可以动态增长。然后代码变为:

// (remove the "acctcount" field as it is no longer useful)
List<Account> accounts = new List<Account>();
// ..
accounts.Add(new Account(stringToCheck));

正如Trevor所指出的,删除了Accounts类中的static修饰符;否则,会员数据将被错误地共享(即,每个帐户都有相同的余额!),并相互"覆盖"。如果使用static是试图从表单"传递回"数据,请参阅C#中如何从表单返回值?寻找更可行的解决方案。公共属性的相同用途可以用于将(Account)对象传递到表单中。

多次单击按钮时会引发异常。

您创建了一个大小为1的数组,第二次单击按钮时,它试图在索引2处添加元素,此时索引已经超出了范围。

数组的大小不会随着添加新项目而增加。

如前所述,您应该使用集合,如List<T>

如果你想继续使用数组,每次添加新项时,你都需要创建一个更大的新数组,将旧数组的元素复制到新数组,并将旧数组引用到新数组。您也可以创建一个更大的数组,并且只在数组已满时创建一个新数组。这基本上就是.Net集合已经实现的。

和往常一样,这一切都取决于你的需求和要求。