在C#中更新全局变量

问题描述 投票:0回答:2

我有一个变量,我可以从这段代码访问。变量是:平衡 这是Form3代码的片段:

    public static int balance = 0;
    private void button1_Click(object sender, EventArgs e)
    {
       int deposit=int.Parse(textBox1.Text);
       if (deposit == 0)
       {
           MessageBox.Show("Please enter a value greater than 0");
       }
       else
       {

           balance = balance + deposit;
           MessageBox.Show("Thank you, your balance has been updated.");
       }
    }

现在,当我想存钱时,我希望余额更新,以便当我从另一个表单查看它时,它需要是编辑后的余额(余额更新为他们存入的金额)。我正在努力获得更新余额,当我在更新的表单中时它会起作用但是当我在另一个表单中查看它时它仍然显示余额为0。

int bal = Form3.balance;
    public int Balance()
    {
        //MessageBox.Show("Your current balance is: "+bal);
        return bal;
    }
    private void button1_Click(object sender, EventArgs e)
    {
       /*if (bal < 0)
        {
            MessageBox.Show("You don't have enough cash in your account, please deposit some money before you can continue");
        }
        else*/ 
        if (bal < 5)
        {
            MessageBox.Show("Please credit your account before you can withdraw");
        }
        else
        {
            MessageBox.Show("Please wait for your £5 to be dispensed");
            bal = bal - 5;

            Balance();//I thought if I returned the balance variable from a different method that it would still update regardless
            //I am struggling making sure that the balance gets updated.
        }

    }

我该怎么做才能确保我的余额变量全局更新?

c# variables global
2个回答
0
投票

int是价值类型。当你完成任务时:

int bal = Form3.balance;

你把bal的价值放入Form3.balance。平衡的任何更新都不能在bal中自动更新,除非您明确地这样做。换句话说,修改Form3.balance对bal变量没有副作用。

您可以在类中包含balance int值,并通过方法或属性公开它。

public class BalanceWrapper
{
   public int Balance {get;set;}
}
public static BalanceWrapper balance;  

//-------

BalanceWrapper bal = Form3.balance;
public int Balance()
{
    //MessageBox.Show("Your current balance is: "+bal);
    return bal.Balance;
}

注意

我只是对什么不起作用的简单解释。像其他人建议的那样,您可能需要重新考虑您的设计(线程安全可能是一个严重的问题)。


0
投票

您应该重构这一点,以便两个表单引用一些共享的内部存储类(或持久性机制)。您当前的设计强制两种形式之间不必要的耦合,如您所见,实际上并不起作用。原因是您的内部变量仅在首次实例化类时设置。您总是可以从另一个表单引用静态变量,但这不会解决耦合问题。此外,您需要担心线程安全,因为两个表单都将使用相同的变量,可能同时在不同的线程中。每个表单最好为该值引用一个线程安全容器。

表格1

// Use dependency injection to populate the service
private AccountService accountService;
// Not sure how you set the account - this might actually be some global state
private long currentAccount;

private decimal Balance { get; set; }

private void button1_Click(object sender, EventArgs e)
{
   int deposit=int.Parse(textBox1.Text);
   if (deposit == 0)
   {
       MessageBox.Show("Please enter a value greater than 0");
   }
   else
   {
       Account account = accountService.GetAccount(currentAccount);
       account.Deposit(deposit);
       this.Balance = account.Balance;
       MessageBox.Show("Thank you, your balance has been updated.");
   }
}

表格2

// Use dependency injection to populate the service
private AccountService accountService;
// Not sure how you set the account - this might actually be some global state
private long currentAccount;

private decimal Balance { get; set; }

private void button1_Click(object sender, EventArgs e)
{
    Account account = accountService.GetAccount(currentAccount);

    if (account.Balance < 5)
    {
        MessageBox.Show("Please credit your account before you can withdraw");
    }
    else
    {
        MessageBox.Show("Please wait for your £5 to be dispensed");
        account.Withdraw(5);
    }
    this.Balance = account.Balance;

}

© www.soinside.com 2019 - 2024. All rights reserved.