簡體   English   中英

關於 C# 變量作用域與其他語言的問題

[英]Question on C# Variable Scope vs. Other Languages

首先聲明一下,我之前從來沒有用過C#,對它的了解也不是很多。

我正在為我的“編程語言”考試學習 Sebesta 的“編程語言概念第 9 版”一書。 在我閱讀了“范圍聲明順序(第 246 頁)”的以下摘錄后,我有點困惑:

“...例如,在 C99、C++、Java 中,所有局部變量的范圍是從它們的聲明到這些聲明出現的塊的末尾。然而,在 C# 中,在塊中聲明的任何變量的范圍是整個塊,無論聲明在塊中的位置如何,只要它不在嵌套塊中即可。方法也是如此。注意C#仍然要求所有變量在使用前都進行聲明。因此,雖然變量的范圍從聲明擴展到出現該聲明的塊或子程序的頂部,該變量仍然不能在其聲明上方使用

為什么 C# 的設計者會做出這樣的決定? 這種不尋常的決定有什么具體的原因/優勢嗎?

看看Eric Lippert關於聲明空間的文章,這些文章為這些規則提供了更多背景知識。

在鏈接到博客文章時,我通​​常會引用最相關的內容,但是當所有人一起閱讀時,我認為這些確實可以提供更好的答案。

希望他會突然出現並給出一個很好的總結。

這會阻止你做一些事情,比如

void Blah()
{
   for (int i = 0; i < 10; i++)
   {
      // do something
   }

   int i = 42;
}

原因是,例如,如果您必須四處移動代碼,它可能會帶來細微錯誤的可能性。 如果您在循環之前需要i ,那么現在您的循環已中斷。

減少混淆的好處之一是,如果變量聲明上方有一個嵌套塊,則變量聲明將生效並防止嵌套塊聲明同名變量。

來自C# 規范

class A
{
    int i = 0;
    void F() {
        i = 1;                  // Error, use precedes declaration
        int i;
        i = 2;
    }
    void G() {
        int j = (j = 1);        // Valid
    }
    void H() {
        int a = 1, b = ++a; // Valid
    }
}

局部變量的作用域規則旨在保證表達式上下文中使用的名稱的含義在塊中始終相同。 如果局部變量的作用域只從它的聲明擴展到塊的末尾,那么在上面的例子中,第一個賦值將賦值給實例變量,第二個賦值將賦值給局部變量,可能導致如果稍后要重新排列塊的語句,則會出現編譯時錯誤。

這並不奇怪。 就變量而言,它比 Java/C++ 更好地強制執行唯一命名。

Eric Lippert 對這個相關問題的回答可能會有所幫助。

正如 Anthony Pegram 之前所說,C# 強制執行此規則是因為在某些情況下,重新排列代碼可能會導致細微的錯誤,從而導致混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM