我使用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;
}
}
}
答案 0 :(得分:3)
报告的异常的问题[很可能]是accounts[acctcount-1]
行,因为当acctcount
为&gt; = 2(例如accounts[1]
)时,它将抛出IndexOutOfBounds异常,如在acctcount
的第一个按钮点击和增加后发生。但是,该阵列仅有一个元素,因为它是使用accounts = new Account[acctcount];
创建的 - 数组在C#中不增长/调整大小。< / p>
最简单,最直接的解决方法是使用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
modifier;否则会员数据将被错误地共享(即每个帐户将具有相同的余额!)并相互“覆盖”。如果使用静态是尝试从表单“传回”数据,请参阅How to return a value from a Form in C#?以获得更可行的解决方案。可以使用相同的公共属性来将(帐户)对象传递到表单。
答案 1 :(得分:2)
多次单击按钮时抛出异常。
您创建了一个大小为1的数组,第二次单击该按钮并尝试在索引2处添加元素时,索引已超出范围。
添加新项目时,数组的大小不会增加。
正如所指出的,你应该使用一个集合,比如List<T>
如果你想继续使用数组,每次添加一个新项时,你需要创建一个更大的新数组,将旧数组的元素复制到新数组,并将旧数组引用到新数组。您还可以创建一个更大的数组,只有在它满了时才创建一个新数组。这基本上是.Net集合已经实现的内容。
与往常一样,这一切都取决于您的需求和要求。