2013-07-20 165 views
2

我刚开始了学习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没有按” t(保持在1)?我不明白,他们都是同样的变数。

回答

7

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

x本地变量 - 在每次调用方法时,有一个新的变量,它总是以0

值开始。如果这还不够说明,请咨询好介绍C#书籍或教程 - 解释有关变量的所有内容对Stack Overflow来说有点多,它比处理编程语言的基础知识更适合处理特定的问题。

+0

语义上,'Md'符号的正确名称不是[Field](http://msdn.microsoft.com/en-us/library/ms173118.aspx)? –

+0

@YairNevet:字段是一种变量。所以在这种情况下,这两个词都是正确的 –

+0

好的。很公平。 –

0

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

+4

那么它不是真正的* *全球 - 这是一个实例变量。 –

0

这是因为您的变量的scope。 MD被声明在函数作用域之外,即在Instance作用域中,因此当你点击按钮时它不会被重新初始化。鉴于x在函数范围内,因此每次单击该按钮时都会将其重新初始化为0。

1

x是局部变量。它只存在于cmdAnzeigen1_Click()-方法的范围内。每当它被调用时,x都会用0初始化,然后递增。所以在这个方法的最后,它总是1.另一个则处于班级的范围内,它不会被重新初始化,并且在班级生活的时候保持它的价值。

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

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

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

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

1

当您的方法(cmdAnzeigen1_Click)完成执行时,您变量正在使用的内存已被释放,随时可以在别处再次使用,以及驻留在该方法内的任何其他变量。

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

,如果你只要你离开使用块,变量Md的内存位置将free'd起来也有类似的东西

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

然后。

Md能够增加,因为它仍然保持其在内存中的地方,那里的x是nolonger需要POST方法

相关问题