相同的变量,不同的结果

时间:2013-07-20 10:09:30

标签: c#

我刚开始学习c#而且我遇到了令人困惑的事情,我希望有人可以向我解释一下:)

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int Md = 0;

        private void cmdAnzeigen1_Click(object sender, EventArgs e)
        {
            int x = 0;
            Md = Md + 1;
            x = x + 1;
            lblErgebnis.Text = "x: " + x + "\n" + "Gx:" + Md;       
        }
    }
}

为什么Md总是增加1,但x没有(保持1)?我不明白,它们都是相同的变量。

5 个答案:

答案 0 :(得分:7)

Md是一个实例变量,在任何方法之外声明。它是对象状态的一部分,因此只要对象“活着”,它就“活着”(并保持其值)。 Form1的不同实例将具有独立的Md变量。

x是一个本地变量 - 每次调用该方法时都会有一个新变量,它始终以值0开始。

如果这还不够解释,请参考一本很好的C#书或教程 - 解释变量的所有内容对于Stack Overflow来说会有点多,这对于处理特定问题比学习编程语言的基础更重要。

答案 1 :(得分:1)

x是局部变量。它只存在于cmdAnzeigen1_Click() - 方法的范围内。每当调用它时,x都会以0初始化,然后递增。因此,在方法的最后,它始终是1.然而,另一个生活在类的范围内,它不会重新初始化并保持它在类生存时的价值。

另外,查看方法的代码 - 每次迭代都会重新声明和初始化变量。这是它的工作原理:该方法中的代码将在被调用时按顺序处理,并且该初始化不会超过该方法。

至于scopes,尝试这样的事情,看看会发生什么:

int x = 1;
{
    int y = x + 1;
}
int z = x + y;

它会抛出一个错误,因为括号引入了一个新范围。来自外部的变量可用于内部,但反之亦然。

答案 2 :(得分:1)

当你的方法(cmdAnzeigen1_Click)完成执行时,你x变量正在使用的内存已经准备就绪,可以在别处再次使用,以及驻留的任何其他变量在方法中。

您的表单也会发生同样的情况。

如果你有类似的东西

using(Form1 frm = new Form1()
{
frm.ShowDialog();
}

然后,一旦你离开使用区块,变量Md在内存中的位置就会被释放。

Md能够增加,因为它仍然在内存中保留其位置,其中x在方法后不再需要

答案 3 :(得分:0)

因为MD是类级变量而x不是。每次点击都会创建并销毁x。但保留了Md的价值。 Md将保留其值,直到保留Form1

答案 4 :(得分:0)

这是因为您的变量的 scope 。 MD在函数范围之外声明,即在实例范围内,因此当您单击按钮时,它永远不会重新初始化。 x在函数范围内,因此每次单击按钮时它都会重新初始化为0.