2013-07-20 209 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方法

相關問題