變量的作用域是可以通路該變量的代碼區域。一般情況下,确定作用域遵循以下規則:
1.隻要類在某個作用域内,其字段(也稱為成員變量)也在該作用域内(這句話可以簡單的了解為,類中定義的字段可以在類中的任意地方被通路到)。
2.局部變量存在于表示聲明該變量的塊語句或方法結束的有花括号之前的作用域内。(注意:局部變量的作用域是定義該變量的語句塊或方法的左右花括号之間的區域,而不是從定義該變量的語句開始到定義該變量的語句塊或方法的右括号之間的區域,這個是我之前犯的一個錯誤。可以參考下邊的例 2-4 )
3.在for、while或類似語句中聲明的局部變量存在于該循環體内。
- 隻要類在某個作用域内,其字段(也稱為成員變量)也在該作用域内(這句話可以簡單的了解為,類中定義的字段可以在類中的任意地方被通路到)。
- 局部變量存在于表示聲明該變量的塊語句或方法結束的右花括号之前的作用域内。
- 在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的作用域如下圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukjN1ITM0ETMz0SN2QzMxYDMxEDOwYDM3EDMy0iN1MzN0ETMvwlNwcTMwIzLcZTNzcDNxEzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
圖 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 }
圖 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 }
雖然同名變量的作用域存在包含關系,但是由于一個是字段,一個是局部變量,是以上述代碼是沒有問題的。