范围块的好处

本文关键字:范围 | 更新日期: 2023-09-27 18:20:12

可能的重复项:
你什么时候使用代码块?

好吧,这可能是一个愚蠢的问题,我可能会错过一些明显的东西,但随着我慢慢学习 C#,这已经困扰了我一段时间。

下面的代码显然编译得很好:

public void Foo()
{
    {
        int i = 1;
        i++;
    }
    {
        int i = 1;
        i--;
    }
}

我知道{}块可用于范围界定。问题是你为什么要这样做?此功能解决了哪些问题?

我可以看到使用它们没有害处,除非它确实增加了更令人困惑的代码,因为与那些"绑定"到流控制、迭代等的作用域相比,这些范围更容易被忽视。

范围块的好处

它在变量声明可能会混淆的语句中很有用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;
    }
}

正如您所指出的,为了范围而创建人工块通常只是令人困惑。我从来没有发现需要它。

如果有一些感知到的需要,我的猜测是重构到一个单独的方法通常是一个更好的选择。

(注意,我并不是说这绝对不好。我只是认为你需要一些非常专业的需求才能拥有它(

对于像这样的"裸"范围块,我倾向于同意你的看法。 从语言设计的角度来看,我认为它们是forwhileif条件下隐式作用域块的概括,在这些条件下它们更重要。 例如:

foreach (var x in foos) {
    var someMessage = x.ToString();
    doSomething(someMessage);
}

快速的答案是它可以防止您以意外的方式无意中更改变量。 通过将其"在范围内",您只能在需要时对其采取行动,而不是"意外"更改值