變數的作用域是可以訪問該變數的代碼區域。一般情況下,確定作用域遵循以下規則: 1.只要類在某個作用域內,其欄位(也稱為成員變數)也在該作用域內(這句話可以簡單的理解為,類中定義的欄位可以在類中的任意地方被訪問到)。 2.局部變數存在於表示聲明該變數的塊語句或方法結束的有花括弧之前的作用域內。(註意... ...
變數的作用域是可以訪問該變數的代碼區域。一般情況下,確定作用域遵循以下規則:
- 只要類在某個作用域內,其欄位(也稱為成員變數)也在該作用域內(這句話可以簡單的理解為,類中定義的欄位可以在類中的任意地方被訪問到)。
- 局部變數存在於表示聲明該變數的塊語句或方法結束的有花括弧之前的作用域內。(註意:局部變數的作用域是定義該變數的語句塊或方法的左右花括弧之間的區域,而不是從定義該變數的語句開始到定義該變數的語句塊或方法的右括弧之間的區域,這個是我之前犯的一個錯誤。可以參考下邊的例 2-4 )
- 在for、while或類似語句中聲明的局部變數存在於該迴圈體內。
下麵,我們通過代碼對上邊3條規則進行解釋:
1 class Person 2 { 3 //定義在類中的變數,稱為類的欄位或成員變數 4 string name = "CS"; 5 int age = 20; 6 7 public void ShowPersonalInfo() 8 { 9 //定義在方法中的變數,此處的變數i,稱為局部變數 10 for (int i = 0; i < 5; i++) 11 { 12 Console.WriteLine("My name is " + name); 13 } 14 for (int i = 0; i < 5; i++) 15 { 16 Console.WriteLine(i.ToString()); 17 } 18 //定義局部變數times 19 int times = 0; 20 while (times < 5) 21 { 22 Console.WriteLine("I'm {0} years old.", age); 23 times++; 24 } 25 Console.WriteLine(times + ":" + "My name is {0},I'm {1} years old !", name, age); 26 } 27 }
通過上面的代碼可以看出,Person類中name、age兩個欄位,以及局部變數times、i的作用域如下圖所示:
圖 2‑3 各變數的作用域
局部變數的作用域衝突
在大型的程式中,在不同部分為不同的變數使用相同的變數名很常見。只要變數的作用域是程式的不同部分,就不會有問題,也不會產生多義性。但要註意,同名的局部變數不能在同一作用域內聲明兩次。
錯誤嘗試:下麵這幾種情況都是局部變數作用域發生衝突的情況
例 2-2:
1 public void ShowPersonalInfo() 2 { 3 int variable = 20; 4 for (int i = 0; i < 5; i++) 5 { 6 Console.WriteLine("My name is {0},I'm {1} years old !", name, age); 7 } 8 int variable = 30; 9 }
由於兩個同名的局部變數variable的作用域一樣,所以可以看到如下錯誤提示:
圖 2‑4 局部變數的作用域及錯誤提示
例 2-3:
1 public void ShowPersonalInfo() 2 { 3 int i = 20; 4 for (int i = 0; i < 5; i++) 5 { 6 Console.WriteLine("My name is {0},I'm {1} years old !", name, age); 7 } 8 }
由於兩個同名局部變數i的作用域存在包含關係,所以可以看到以下錯誤提示:
圖 2‑5 局部變數的作用域及錯誤提示
例 2-4:
1 public void ShowPersonalInfo() 2 { 3 for (int i = 0; i < 5; i++) 4 { 5 Console.WriteLine("My name is {0},I'm {1} years old !", name, age); 6 } 7 int i = 20; 8 }
由於兩個同名局部變數i的作用域存在包含關係,所以可以看到以下錯誤提示:
圖 2‑6 局部變數的作用域及錯誤提示
欄位和局部變數的作用域衝突
某些情況下,可以區分名稱的相同、作用域相同的變數。C#在變數之間有一個基本的區分,它把在類型級別聲明的變數看作欄位,而把方法中聲明的變數看做局部變數。
例 2-5:
1 class Person 2 { 3 //定義在類中的變數,稱為類的欄位或成員變數 4 string name = "CS"; 5 int age = 20; 6 7 public void ShowPersonalInfo() 8 { 9 //定義名稱相同的局部變數 10 int age = 30; 11 string name = "CS2"; 12 //局部變數隱藏了同名欄位的值,此處的輸出結果是”My name is CS2,I'm 30 years old !" 13 Console.WriteLine("My name is {0},I'm {1} years old !", name, age); 14 } 15 }
雖然同名變數的作用域存在包含關係,但是由於一個是欄位,一個是局部變數,所以上述代碼是沒有問題的。