C# 其他結(jié)構(gòu)中變量的作用域
變量的作用域包含定義它們的代碼塊和直接嵌套 在其中的代碼塊。這一點(diǎn)也適用于其他代碼塊,例如分支和循環(huán)結(jié)構(gòu)的代碼塊??紤]下面的代碼:
int i;
for (i =0; i < 10; i++)
string text = $"Line {Convert.ToString (i) }";
WriteLine($"{text}");
}
WriteLine($"rLast text output in loop: {text}");
字符串變量text是for循環(huán)的局部變量,這段代碼不能編譯,因?yàn)樵谠撗h(huán)外部調(diào)用的WriteLine()試圖使用該字符串變量,但是在循環(huán)外部該字符串變量會超出作用域。修改代碼,如下所示:
int i;
string text;
for (i = 0; i < 10; i++)
{
text = $"Line {Convert. ToString(i)}";
WriteLine($"{text}");
}
WriteLine($"Last text output in loop: {text}");
這段代碼也會失敗,原因是必須在使用變量前對其進(jìn)行聲明和初始化,但text只在for循環(huán)中進(jìn)行了初始化。由于沒有在循環(huán)外進(jìn)行初始化,因此賦給text的值在循環(huán)塊退出時(shí)就丟失了。但可以進(jìn)行如下修改:
int i;
string text = " ";
for (i =0; i < 10; i++)
{
text = $"Line {Convert.ToString(i)}";
WriteLine($"{text}"};
}
WriteLine($"Last text output in loop: {text}"};
這次text是在循環(huán)外部初始化的,所以可以訪問它的值。
在循環(huán)中最后賦給text的值可以在循環(huán)外部訪問??梢钥闯觯@個(gè)主題的內(nèi)容需要花一點(diǎn)時(shí)間來掌握。在前面的示例中,循環(huán)之前將空字符串賦給text,而在循環(huán)之后的代碼中,text就不會是空字符串了,其原因可能一下子看不出來。
這種情況的解釋涉及分配給text變量的內(nèi)存空間,實(shí)際上任何變量都是這樣。只聲明一個(gè)簡單的變量類型,并不會引起其他變化。只有在給變量賦值后,這個(gè)值才會被分配一塊內(nèi)存空間。如果這種分配內(nèi)存空間的行為在循環(huán)中發(fā)生,該值實(shí)際上被定義為一個(gè)局部值,在循環(huán)外部會超出其作用域。
即使變量本身未局部化到循環(huán)上,其包含的值卻會局部化到該循環(huán)上。但在循環(huán)外部賦值可以確保該值是主體代碼的局部值,在循環(huán)內(nèi)部它仍處于其作用域中。這意味著變量在退出主體代碼塊之前是沒有超出作用域的,所以可在循環(huán)外部訪問它的值。
幸好,譯器可檢測變量作用域的問題,根據(jù)它生成的錯(cuò)誤信息修正程序有助于我們理解變量的作用域問題。
點(diǎn)擊加載更多評論>>