C#中的变量范围,Java

时间:2012-04-21 08:29:34

标签: c# java oop scope

不,这不是我的功课 (因为我旁边有一叠答题纸,等待被标记。)

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

教科书答案是b,非常简单。

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

this.x

MainProgram.x

表示静态变量。

所以我的问题是:
对于C#,选项b是否可以被认为是真的?为什么呢?

请分享您的想法。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

我建议您参考C#4规范的第3.7.1节,为了您的方便,我在这里开始引用:

  

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

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

阅读第3.7.1节的其余部分了解详情。

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