如何从 C# 中的 class 构造函数获取所有对象的参数
How do I obtain a parameter of all objects from a class constructor in c#
我正在使用 c#.NET 制作一种非常基本的在线 ATM 应用程序。基本上我创建了一个名为 account 的 class 并使用了一个构造函数来存储客户的账户,使它们成为 class 的对象。这些客户需要输入密码才能登录。客户的 pin 是客户对象的参数之一,我一直在尝试制作一个循环,循环遍历所有个人客户并确定该 pin 属于哪个帐户。
class Account
{
public string customerName;
public string pin;
public int balance;
public Account(string accCustomerName, string accPin, int accBalance)
{
customerName = accCustomerName;
pin = accPin;
balance = accBalance;
}
}
private void Form1_Load(object sender, EventArgs e)
{
Account acc1 = new Account("Henry_Adobe", "2316", 10000);
Account acc2 = new Account("Patrick_Boka", "3198", 15000);
Account acc3 = new Account("Fred_Simp", "8768", 20000);
Account acc4 = new Account("Derek_Black", "7645", 25000);
if (txtInput.Text == acc1.pin)
{
MessageBox.Show("Login Succesful!");
}
}
我已经通过声明每个对象的特定名称 (acc1.pin) 设法访问了 pin,但这效率不高,因为它需要我输入每个对象的名称。有什么方法可以方便地访问所有账户的参数吗?
我会带你更进一步,因为每次运行时都会忘记最后余额的 ATM 应用程序不是很有用。
让我们从Account
开始 class:
class Account
{
public string CustomerName {get;set;};
public string PIN {get;set;};
public decimal Balance {get;set;};
public Account(string customerName, string Pin, decimal balance)
{
CustomerName = customerName;
PIN = Pin;
Balance = balance;
}
public static IList<Account> Accounts {get;private set;} = new List<Account>();
public static void ReadAccounts(string fileName)
{
using var rdr = new Microsoft.VisualBasic.FileIO.TextFieldParser(AccountsFileName))
{
rdr.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
rdr.Delimiters = new string[] {','};
Accounts.Clear();
string[] row = null;
while( (row = rdr.ReadFields()) != null)
{
Accounts.Add(new Account(row[3], row[0], Decimal.Parse(row[1])));
}
}
}
public static void WriteAccounts(string fileName)
{
using (var writer = new StreamWriter(fileName, false))
{
writer.WriteLine("PIN,Balance,CustomerName");
foreach(var acct in Accounts)
{
writer.WriteLine($"{acct.PIN},{acct.Balance},\"{acct.CustomerName}\"");
}
}
}
}
我们将字段更新为具有有意义数据类型的属性,添加了一个静态位置来保存帐户列表,并添加了从文件读取和写入的方法。稍后,您将用某种数据库替换 csv 文件,但这将帮助您入门。
现在让我们继续加载表单:
private string AccountsFileName = "AccountsFile.csv";
private void Form1_Load(object sender, EventArgs e)
{
Account.ReadFile(AccountsFileName);
}
但我们需要到此为止。在加载表单时,用户还没有机会输入任何文本!除了文本框之外,您还需要一个按钮,用户可以在其中输入 pin 后单击以登录:
private Account currentAccount = null;
private void btnLogin_Click(object sender, EventArgs e)
{
currentAccount = Account.Accounts.FirstOrDefault(a => a.PIN == txtInput.Text);
if (currentAccount != null)
{
MessageBox.Show("Login successful!");
return;
}
MessageBox.Show("Login failed");
}
最后,您需要一种在程序结束时保存文件的方法。现在我只使用 Form1_Closing 事件,但稍后您可能需要一些不同的东西:
private void Form1_Closing(object sender, EventArgs e)
{
Account.WriteAccounts(AccountsFileName);
}
您仍然缺少向用户显示余额并允许他们存款和取款的能力。此外,任何值得使用的 ATM 都需要显示单独的 交易 ,通常存储为两个抵消分类账条目。
我正在使用 c#.NET 制作一种非常基本的在线 ATM 应用程序。基本上我创建了一个名为 account 的 class 并使用了一个构造函数来存储客户的账户,使它们成为 class 的对象。这些客户需要输入密码才能登录。客户的 pin 是客户对象的参数之一,我一直在尝试制作一个循环,循环遍历所有个人客户并确定该 pin 属于哪个帐户。
class Account
{
public string customerName;
public string pin;
public int balance;
public Account(string accCustomerName, string accPin, int accBalance)
{
customerName = accCustomerName;
pin = accPin;
balance = accBalance;
}
}
private void Form1_Load(object sender, EventArgs e)
{
Account acc1 = new Account("Henry_Adobe", "2316", 10000);
Account acc2 = new Account("Patrick_Boka", "3198", 15000);
Account acc3 = new Account("Fred_Simp", "8768", 20000);
Account acc4 = new Account("Derek_Black", "7645", 25000);
if (txtInput.Text == acc1.pin)
{
MessageBox.Show("Login Succesful!");
}
}
我已经通过声明每个对象的特定名称 (acc1.pin) 设法访问了 pin,但这效率不高,因为它需要我输入每个对象的名称。有什么方法可以方便地访问所有账户的参数吗?
我会带你更进一步,因为每次运行时都会忘记最后余额的 ATM 应用程序不是很有用。
让我们从Account
开始 class:
class Account
{
public string CustomerName {get;set;};
public string PIN {get;set;};
public decimal Balance {get;set;};
public Account(string customerName, string Pin, decimal balance)
{
CustomerName = customerName;
PIN = Pin;
Balance = balance;
}
public static IList<Account> Accounts {get;private set;} = new List<Account>();
public static void ReadAccounts(string fileName)
{
using var rdr = new Microsoft.VisualBasic.FileIO.TextFieldParser(AccountsFileName))
{
rdr.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
rdr.Delimiters = new string[] {','};
Accounts.Clear();
string[] row = null;
while( (row = rdr.ReadFields()) != null)
{
Accounts.Add(new Account(row[3], row[0], Decimal.Parse(row[1])));
}
}
}
public static void WriteAccounts(string fileName)
{
using (var writer = new StreamWriter(fileName, false))
{
writer.WriteLine("PIN,Balance,CustomerName");
foreach(var acct in Accounts)
{
writer.WriteLine($"{acct.PIN},{acct.Balance},\"{acct.CustomerName}\"");
}
}
}
}
我们将字段更新为具有有意义数据类型的属性,添加了一个静态位置来保存帐户列表,并添加了从文件读取和写入的方法。稍后,您将用某种数据库替换 csv 文件,但这将帮助您入门。
现在让我们继续加载表单:
private string AccountsFileName = "AccountsFile.csv";
private void Form1_Load(object sender, EventArgs e)
{
Account.ReadFile(AccountsFileName);
}
但我们需要到此为止。在加载表单时,用户还没有机会输入任何文本!除了文本框之外,您还需要一个按钮,用户可以在其中输入 pin 后单击以登录:
private Account currentAccount = null;
private void btnLogin_Click(object sender, EventArgs e)
{
currentAccount = Account.Accounts.FirstOrDefault(a => a.PIN == txtInput.Text);
if (currentAccount != null)
{
MessageBox.Show("Login successful!");
return;
}
MessageBox.Show("Login failed");
}
最后,您需要一种在程序结束时保存文件的方法。现在我只使用 Form1_Closing 事件,但稍后您可能需要一些不同的东西:
private void Form1_Closing(object sender, EventArgs e)
{
Account.WriteAccounts(AccountsFileName);
}
您仍然缺少向用户显示余额并允许他们存款和取款的能力。此外,任何值得使用的 ATM 都需要显示单独的 交易 ,通常存储为两个抵消分类账条目。