我能使用相同的本地变量来处理C#中的两个不同事件吗?

3

我是一个编程初学者,如果这是一个简单的问题,我很抱歉。我的程序在启动应用程序时生成一个随机的数学问题(加法)。用户输入他/她认为的答案。接下来,用户点击按钮,显示的文本指示用户的答案是否正确。

我在Form Load事件中使用了变量number1和number2。如何在按钮单击事件中轻松地再次使用它们?

(希望我的代码能够说明我想做什么).....

    public Form1()
    {
        InitializeComponent();
    }
    //New Method
    private void GenerateRandoms()
    {
        // create random number variable
        Random randomNumber = new Random();
        int number1; 
        int number2; 

        number1 = randomNumber.Next(100, 501);
        number2 = randomNumber.Next(100, 501);

        randomProblemLeft.Text = number1.ToString();
        randomProblemRight.Text = number2.ToString(); 
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        // Call created method so random numbers are generated once form loads.
        GenerateRandoms();
    }

    private void checkButton_Click(object sender, EventArgs e)
    {
        int rightAnswer; //The correct answer for the addition problem
        int theirAnswer; // The answer given by the user

        theirAnswer = int.Parse(answerInput.Text);

        rightAnswer = (number1 + number2); //Trying to reuse these variables from first event????????????

        if (rightAnswer == theirAnswer)
        {
            checkOutput.Text = "Yes, that is the correct answer!";
        }
        else
        {
            checkOutput.Text = "Sorry, that is incorrect!";
        }
    }

    private void clearButton_Click(object sender, EventArgs e)
    {
        answerInput.Text = "";
        checkOutput.Text = "";
        GenerateRandoms();
    }

    private void exitButton_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}

}


啊,是的!谢谢 philologon!!! 很高兴你今天教会了我新东西 :) - Learnin2Code
无论你认为哪个答案最切合实际,你都应该通过在左侧的投票按钮下面点击“接受答案”图标来接受那个答案。在您的问题至少存在10分钟之前,您将无法执行此操作。 - philologon
1
哦,好的,抱歉,我不知道。我在寻找一种“关闭”问题的方法。谢谢。 - Learnin2Code
3个回答

0

按钮点击事件实际上有自己的作用域,因此您有几个选项。首先,在按钮点击事件中再次声明变量number1和number2。

如果您希望某些原因下的值保持不变,则应在类的范围内声明number1和number2。这将使它们成为您创建的对象的一部分。

示例

public class Form1()
{
   private int number1;
   private int number2;

   //your functions here
}

0

局部变量在超出其作用域后立即消失(即在声明该局部变量的代码块的闭合大括号被执行后)。它们的值被丢弃,无法恢复。这就是为什么在这种情况下局部变量不起作用的原因:您需要将它们定义为实例变量。

在类级别上将变量声明为私有变量,从方法中删除声明,并在任何方法中使用实例变量:

private int number1; // Declared at the form level
private int number2; 
private void GenerateRandoms()
{
    // create random number variable
    Random randomNumber = new Random();
    number1 = randomNumber.Next(100, 501);
    number2 = randomNumber.Next(100, 501);
    ...
}
private void checkButton_Click(object sender, EventArgs e)
{
    int answer = number1 + number2;
    ...
}

非常感谢!我很高兴你向我展示了那个 :) 我之前不知道它是这样工作的,但我想每天都会学到新东西。 - Learnin2Code
1
@user2852838 这是非常基础的内容 - 类在使用时经常会用到。但是在用户界面类中过多地使用这些可能会有问题。在学校作业中使用它们没问题,但在生产代码中,你真的希望你的 GUI(即表单)与数据模型(即 number1number2)尽可能分离。 - Sergey Kalinichenko
谢谢你的帮助。我很喜欢这个网站。这里有一群真正关心彼此的伟大社区 :) - Learnin2Code

0
你可以把它们放在与方法相同的括号级别上,使它们成为Form1类的“全局”变量。这将使它们成为成员字段。
class Form1 
{
   private int number1; 
   private int number2; 
   // . . . the rest of the class goes here –
}

以这种方式做可以使它们(在范围内)对所有类的方法可用。在那里放置“private”关键字可以使其他人无法访问它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接