【问题标题】:Question on C# Variable Scope vs. Other Languages关于 C# 变量范围与其他语言的问题
【发布时间】:2010-06-04 18:09:59
【问题描述】:

首先,我说我之前没用过C#,也不是很了解。

我正在为我的“编程语言”考试学习 Sebesta 的“编程语言概念第 9 版”一书。看了下面这段摘自“范围声明顺序(第246页)”后,我有点疑惑:

"...例如,在 C99、C++、Java 中,所有局部变量的范围是从它们的声明到出现这些声明的块的末尾。但是,在 C# 中,任何变量的范围在块中声明的就是整个块,不管声明在块中的位置,只要它不在嵌套块中。对于方法也是如此。注意,C#仍然需要所有变量在使用前都要声明。因此,尽管变量的范围从声明延伸到出现该声明的块或子程序的顶部,但该变量仍然不能在其声明之上使用"

为什么 C# 的设计者会做出这样的决定?这种不寻常的决定是否有任何具体原因/优势?

【问题讨论】:

  • 那是非常微不足道的。它几乎无法改变程序或应用程序的结果。
  • @Khnle:然而,乍一看,这似乎是一种任意矛盾的做事方式。我认为这个问题没有任何问题。
  • @Khnle,我不同意。它在编译时产生了巨大的(主要是积极的)影响,请参阅示例的答案。了解此功能存在的原因可以深入了解 C# 的设计思想。

标签: c# scope


【解决方案1】:

这会阻止你做一些事情,比如

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

   int i = 42;
}

原因是,例如,如果您必须移动代码,它会引入细微错误的可能性。如果您在循环之前需要i,那么现在您的循环已损坏。

【讨论】:

    【解决方案2】:

    减少混淆的一个例子是,如果您在变量声明上方有一个嵌套块,则变量声明将生效并阻止嵌套块声明具有相同名称的变量。

    【讨论】:

      【解决方案3】:

      来自C# Spec

      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
          }
      }
      

      局部变量的作用域规则旨在保证在表达式上下文中使用的名称的含义在块中始终相同。如果局部变量的范围仅从其声明扩展到块的末尾,那么在上面的示例中,第一个赋值将分配给实例变量,第二个赋值将分配给局部变量,可能导致如果稍后要重新排列块的语句,则会出现编译时错误。

      【讨论】:

        【解决方案4】:

        这并不奇怪。就变量而言,它比 Java/C++ 更好地执行唯一命名。

        【讨论】:

          【解决方案5】:

          Eric Lippert 在this related question 上的回答可能会有所帮助。

          正如 Anthony Pegram 之前所说,C# 强制执行此规则,因为在某些情况下重新排列代码可能会导致细微的错误,从而导致混乱。

          【讨论】:

            猜你喜欢
            • 2016-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-09
            • 2013-12-04
            • 1970-01-01
            相关资源
            最近更新 更多