[英]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.