【问题标题】:Variable Scope in C#, JavaC#、Java 中的变量作用域
【发布时间】:2012-05-02 16:49:58
【问题描述】:

不,这不是我的作业。
(因为我旁边有一叠答题卡,等着批改。)

问:如果方法中的局部变量与主程序中的变量同名,会发生什么?
a) 产生错误
b) 主程序中的变量是“隐藏”的,直到方法执行完毕
c) 主程序中的变量将覆盖方法中的变量
d) 以上都不是。

教科书的答案是b,很简单。

但仔细想想,它真的“隐藏”了吗?
据我所知,在 C# 和 Java 等纯面向对象语言中,
我们总是可以使用

this.x

MainProgram.x

用于静态变量。

所以我的问题是:
对于 C#,选项 b 可以被认为是正确的吗?为什么?

请分享你的想法。

【问题讨论】:

  • 您似乎只是在指出口语程序员在这里对“隐藏”的使用与字典定义不太匹配?很多事情都是如此。
  • 看看this
  • 谢谢,这很有帮助。我从来没有听说过阴影。我不是母语人士。
  • 查看Eric Lippert's blog,特别是:简单的名字没那么简单Part 1Part 2

标签: c# java oop scope


【解决方案1】:

是的,局部变量 x 在该方法/块的范围内隐藏(或者更准确地说,shadows - 感谢@pst)成员变量 x。您可以将后者的限定名称称为this.x,以使生活更轻松,但答案是正确的。 (完全)限定名称不再依赖于范围,因此它不能被隐藏或隐藏。

【讨论】:

    【解决方案2】:

    请参阅 C# 4 规范的第 3.7.1 节,为方便起见,我在此引用其开头:

    实体的范围通常包含比实体的声明空间更多的程序文本。特别是,实体的范围可能包括引入新声明空间的声明,这些声明空间包含同名实体。此类声明会导致原始实体隐藏。相反,当实体不隐藏时,它被称为可见

    正确理解规范的这一部分要求您了解实体的范围与其声明空间之间的区别。 范围 是程序文本的区域,其中实体可以通过其非限定名称来引用。 声明空间是实体名称唯一的程序文本区域。

    请阅读第 3.7.1 节的其余部分了解详细信息。

    我还注意到,指定的术语是“隐藏的”,尽管“阴影”也经常使用。

    【讨论】:

    • 与 .NET 捆绑在一起的 C# 规范文档是一个惊人的信息来源,我多次使用它来阐明似乎违反逻辑的事情。我希望更多的人会阅读它(没有冒犯海报的意思)。
    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2018-01-20
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多