位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C# > 問(wèn)題詳情

C# 其他結(jié)構(gòu)中變量的作用域

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-04

    變量的作用域包含定義它們的代碼塊和直接嵌套 在其中的代碼塊。這一點(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)外部該字符串變量會(huì)超出作用域。修改代碼,如下所示:

int i;

string text;

for (i = 0; i < 10; i++)

{

    text = $"Line {Convert. ToString(i)}";

    WriteLine($"{text}");

}

WriteLine($"Last text output in loop: {text}");

    這段代碼也會(huì)失敗,原因是必須在使用變量前對(duì)其進(jìn)行聲明和初始化,但text只在for循環(huán)中進(jìn)行了初始化。由于沒(méi)有在循環(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)外部初始化的,所以可以訪問(wèn)它的值。


    在循環(huán)中最后賦給text的值可以在循環(huán)外部訪問(wèn)??梢钥闯?,這個(gè)主題的內(nèi)容需要花一點(diǎn)時(shí)間來(lái)掌握。在前面的示例中,循環(huán)之前將空字符串賦給text,而在循環(huán)之后的代碼中,text就不會(huì)是空字符串了,其原因可能一下子看不出來(lái)。

    這種情況的解釋涉及分配給text變量的內(nèi)存空間,實(shí)際上任何變量都是這樣。只聲明一個(gè)簡(jiǎn)單的變量類(lèi)型,并不會(huì)引起其他變化。只有在給變量賦值后,這個(gè)值才會(huì)被分配一塊內(nèi)存空間。如果這種分配內(nèi)存空間的行為在循環(huán)中發(fā)生,該值實(shí)際上被定義為一個(gè)局部值,在循環(huán)外部會(huì)超出其作用域。

    即使變量本身未局部化到循環(huán)上,其包含的值卻會(huì)局部化到該循環(huán)上。但在循環(huán)外部賦值可以確保該值是主體代碼的局部值,在循環(huán)內(nèi)部它仍處于其作用域中。這意味著變量在退出主體代碼塊之前是沒(méi)有超出作用域的,所以可在循環(huán)外部訪問(wèn)它的值。

    幸好,譯器可檢測(cè)變量作用域的問(wèn)題,根據(jù)它生成的錯(cuò)誤信息修正程序有助于我們理解變量的作用域問(wèn)題。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部