我以前有以下代码:
public class Program
{
public static void Main(string[] args)
{
int i = 0;
while(condition)
{
.........
.........
if (condition)
{
i = 6;
Console.WriteLine("Inside Block :" +i);
}
else
{
i = 7;
Console.WriteLine("After block : " + i);
}
}
}
}
后来,我发现我不需要任何条件,并且希望每次将6分配给变量i
。所以我注释掉了代码,但是这样做却犯了一个愚蠢的错误,所以现在我的代码如下:
公共课程 {
public static void Main(string[] args)
{
int i = 0;
while(condition)
{
.........
.........
// a block without condition
{
i = 6;
Console.WriteLine("Inside Block :" +i);
}
}
}
}
如您所见,错误地我只是注释掉/删除了具有if
条件的行,却忘了删除这些块。现在,这个块在这里意味着什么。无论如何,它每次都会执行,但是为什么编译时没有给出任何错误?
我们在这里有任何术语/概念吗?我知道Initializer Block
中的Java
,但这不是这里发生的情况。在Multi-Threading
环境中,它的工作方式是否会有所不同?
任何信息都会很有帮助。
答案 0 :(得分:2)
为什么编译时没有给出任何错误?
我们在这里有任何术语/概念吗?
因为C#允许您这样做。 C#语言规范第1.5节:
一个块允许在允许单个语句的上下文中编写多个语句。块由在定界符
{
和}
之间编写的语句列表组成。
实际上,您熟悉的if语句和while语句仅需在其标题之后添加一个语句,并且由于在允许单个语句的地方都允许使用块,因此您可以在此处编写一个块。
这些没有任何标题的块的工作原理与其他任何块一样。他们创建了一个新的范围。在该块中声明的变量无法在该块外部访问。
答案 1 :(得分:2)
基本上,当您放置{}
块(也称为作用域)时,它定义了代码执行的边界。
public static void Main(string[] args)
{
int i = 0;
while(condition)
{
.........
.........
// a block without condition
{
i = 6;
Console.WriteLine("Inside Block :" +i);
}
}
}
}
由于变量i
是在方法级别定义的,因此对您的代码没有太大影响。
假设您在该范围内定义了一个变量,然后尝试在外部访问该变量,这将产生错误,因为在范围内定义的任何变量都限制了范围的边界。
例如。
public static void Main(string[] args)
{
int i = 0;
while(condition)
{
.........
.........
// a block without condition
{
int j = 44;
i = 6;
Console.WriteLine("Inside Block :" +i);
}
}
Console.WriteLine(j); // <------------------ This would generate error.
}
}