(原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域
6.2? 變量的作用域
在上一節中,讀者可能想知道為什么需要利用函數交換數據。原因是C#中的變量僅能從代碼的本地作用域訪問。給定的變量有一個作用域,訪問該變量要通過這個作用域來實現。
在上一節中,讀者可能想知道為什么需要利用函數交換數據。原因是C#中的變量僅能從代碼的本地作用域訪問。給定的變量有一個作用域,訪問該變量要通過這個作用域來實現。代碼如下:
class Program { static void Write() { Console.WriteLine("myString = {0}", myString); } static void Main(string[] args) { string myString = "String defined in Main()"; Write(); Console.ReadKey(); } }編譯代碼,注意顯示在任務列表中的錯誤和警告:
當前上下文中不存在名稱“myString”【The name 'myString' does not exist in the current context】 變量“myString”已賦值,但其值從未使用過【The variable 'myString' is assigned but its value is never used】什么地萬出錯了?不能在Write()函數中訪問在應用程序主體(Main()函數)中定義的變量myString。
原因是變量是有作用域的,在這個作用域中,變量才是有效的。這個作用域包括定義變量的代碼塊和直接嵌套在其中的代碼塊。函數中的代碼塊與調用它們的代碼塊是不同的。在Write()中,沒有定義myString,在Main()中定義的myString則超出了作用域——它只能在Main()中使用。
實際上,在Write()中可以有一個完全獨立的變量myString,修古代碼,如下所示:
class Program { static void Write(){ string myString = "String defined in Write()"; Console.WriteLine("Now in Write()"); Console.WriteLine("myString = {0}", myString); } static void Main(string[] args) { string myString = "String defined in Main()"; Write(); Console.WriteLine("\nNow in Main()"); Console.WriteLine("myString = {0}", myString); Console.ReadKey(); } }運行后可以看到結果。
這段代碼執行的操作如下:
?? Main()定義和初始化字符串變量myString。
?? Main()把控制權傳送給Wri。
?? Write()定義和初始化字符串變量myString,它與Main()中定義的myString變量完全不同。
?? Write()把一個字符串輸出到控制臺上,該字符串包含在Write()中定義的myString的值。
?? Write()把控制僅傳送回Main()。
?? Main()把一個字符串輸出到控制臺上,該字符串包含在Main()中定義的myString的值。
其作用域以這種方式覆蓋一個函數的變量稱為局部變量。還有一種全局變量,其作用域可覆蓋多個函數。修改代碼,如下所示:
class Program { static string myString; static void Write() { string myString = "String defined in Write()"; Console.WriteLine("Now in Write()"); Console.WriteLine("Local myString = {0}", myString); Console.WriteLine("Global myString = {0}", Program.myString); } static void Main(string[] args) { string myString = "String defined in Main()"; Program.myString = "Global string"; Write(); Console.WriteLine("\nNow in Main()"); Console.WriteLine("Local myString = {0}", myString); Console.WriteLine("Global myString = {0}", Program.myString); Console.ReadKey(); } }這里添加了另一個變量myString,這次進一步加深了代碼中的名稱層次。這個變量定義如下:
static string myString;注意,這里也需要static關鍵字。在這種類型的控制臺應用程序中,必須使用static或const關鍵字,來定義這種形式的全局變量。如果要修改全局變量的值,就需要使用static,因為const禁止修改變量的值。
為了區分這個變量和Main()與Write()中的同名局部變量,必須用一個完整限定的名稱為變量名分類。這里把全局變量稱為Program.myString。注意,在全局變量和局部變量同名時,這是必需的。如果沒有局部myString變量,就可以使用myString表示全局變量,而不需要使用Program.myString。如果局部變量和全局變量同名,全局變量就會被屏蔽。
是否使用全局變量取決于函數的位置。使用全局變量的問題在于,它們通常不適合于“常規用途”的函數——這些函數能處理我們所提供的任意數據,而不僅限于處理特定全局變量中的數據。
?
6.2.1? 其他結構中變量的作用域
變量的作用域包含定義它們的代碼塊和直接嵌套在其中的代碼塊。這也可以應用到其他代碼塊上,例如分支和循環結構的代碼塊。考慮下面的代碼:
int i; for (i = 0; i < 10; i++) { string text = "Line " + Convert.ToString(i); Console.WriteLine("{0}", text); } Console.WriteLine("Last text output in loop: {0}", text);字符串變量text 是for 循環的局部變量,這段代碼不能編譯,因為在該循環外部調用的Console.WriteLine()試圖使用該變量text,這超出了循環的作用域。修改代碼,如下所示:
int i; string text; for (i = 0; i < 10; i++) { text = "Line " + Convert.ToString(i); Console.WriteLine("{0}", text); } Console.WriteLine("Last text output in loop: {0}", text);這段代碼也會失敗,原因是必須在使用變量前對其進行聲明和初始化,而text 是在for循環中初始化的。賦給text的值在循環塊退出時就丟失了。但是還可以進行如下修改:
int i; string text = ""; for (i = 0; i < 10; i++) { text = "Line " + Convert.ToString(i); Console.WriteLine("{0}", text); } Console.WriteLine("Last text output in loop: {0}", text);只聲明一個簡單變量類型,并不會引起其他的變化。只有在給變量賦值后,這個值才占用一塊內存空間。如果這種占據內存空間的行為在循環中發生,該值實際上定義為一個局部值,在循環的外部會超出了其作用域。
即使變量本身沒有局部化到循環上,循環所包含的值也局部化到該循環上。但是,在循環外部賦值可以確保該值是主體代碼的局部值,在循環內部它仍處于其作用域中。這意味著變量在退出主體代碼塊之前是沒有超出作用域的,所以可以在循環外部訪問它的值。
最后一個要注意的問題是,應采用“最佳實踐方式”。一般情況下,最好在聲明和初始化所有變量后,再在代碼塊中使用它們。一個例外是把循環變量聲明為循環塊的一部分,例如:
for (int i = 0; i < 10; i++) { ... }?
轉載于:https://www.cnblogs.com/wodehao0808/p/4912236.html
總結
以上是生活随笔為你收集整理的(原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言俄罗斯方块源代码 解说,C语言课程
- 下一篇: ASP.NET(c#)实现重定向的三种方