好吧,这可能是一个愚蠢的问题,我可能会遗漏一些明显的东西但是当我慢慢学习C#时,这已经让我唠叨了一段时间。
以下代码显然编译得很好:
public void Foo()
{
{
int i = 1;
i++;
}
{
int i = 1;
i--;
}
}
我知道{}
块可用于范围界定。问题是你为什么要这样做?这个功能解决了哪些问题?
我在使用它们时没有任何害处,除非它确实增加了一个更令人困惑的代码,因为与那些“绑定”流控制,迭代等相比,这些范围可能更容易被忽略。
答案 0 :(得分:6)
在switch
语句中,您的变量声明可能会变得混乱:
令人困惑的代码:
switch (true)
{
case true:
var msg = "This is true.";
var copy = msg;
break;
case false:
msg = "This is false.";
copy = msg;
break;
}
清除代码:
switch (true)
{
case true:
{
var msg = "This is true.";
var copy = msg;
break;
}
case false:
{
var msg = "This is false.";
var copy = msg;
break;
}
}
答案 1 :(得分:3)
我想说,为了确定范围而创建一个人工块通常会让人感到困惑,正如您所指出的那样。我从来没有找到它的需要。
如果有人认为需要它,我的猜测是重构成一个单独的方法通常是一个更好的选择。
(注意我并不是说绝对坏。我认为你需要一些非常专业的需要才能拥有它)
答案 2 :(得分:1)
对于像这样的“裸露”范围,我倾向于同意你的看法。从语言设计的角度来看,我认为它们是for
,while
和if
条件中隐式作用域块的概括,它们更重要。例如:
foreach (var x in foos) {
var someMessage = x.ToString();
doSomething(someMessage);
}
答案 3 :(得分:0)
快速回答是它可以防止您以意外的方式无意中更改变量。通过让它“在范围内”,你可以只在你想要而不是“意外地”改变价值时采取行动