2

我发现自己经常限制范围。我发现它使代码更清晰,并让我更容易重用变量。这在 C 中特别方便,因为变量必须在新作用域的开头声明。

这是我的意思的一个例子。

{
        int h = 0;
        foreach (var item in photos)
        {
            buffer = t.NewRow();
            h = item.IndexOf("\\x\\");
            buffer["name"] = item.Substring(h, item.Length - h);
            t.Rows.Add(buffer);
        }
}

在这个例子中,我限制了 h 的范围,没有在每次迭代中初始化它。

但我没有看到很多其他开发人员经常这样做。这是为什么?这样做有缺点吗?

4

4 回答 4

5

好吧,在这种情况下,无论如何你都会在每次迭代中分配一个新值,而不使用“旧”值 - 所以我会使用:

foreach (var item in photos)
{
    buffer = t.NewRow();
    int h = item.IndexOf("\\x\\");
    buffer["name"] = item.Substring(h, item.Length - h);
    t.Rows.Add(buffer);
}

我发现,如果我尽可能积极地这样做(当然是在合理范围内),我就没有太多的范围界定问题了——如果我这样做了,这可能意味着方法太长了,我应该重构无论如何。

我敢说它对旧式 C 很有帮助——但是当我编写 C# 时,我认为没有理由做在 C 中有用但不改进我的 C# 的事情:)

于 2010-06-18T05:43:26.053 回答
3

大多数开发人员对范围界定非常粗心。我曾与开发人员一起工作,他们尽可能地扩大范围以避免分配“额外”变量。这通常是由于人们认为您正在节省内存,因为您不了解堆栈变量。尽管如此,您正在做正确的事情,尽管通过在 foreach 循环之外初始化变量所获得的节省是最小的,我可能不会打扰。

于 2010-06-18T05:51:36.797 回答
3

即使您使用的 C 版本仍然需要在块中的语句之前声明变量,以下内容在非调试版本中不会产生不良性能影响:

    foreach (var item in photos)
    {
        int h = 0;
        buffer = t.NewRow();
        h = item.IndexOf("\\x\\");
        buffer["name"] = item.Substring(h, item.Length - h);
        t.Rows.Add(buffer);
    }

编译器将认识到h实际上并未使用 的“初始化”,因此它不会费心去做(即使在循环的第一次迭代中)。编译器也不会费心重新分配h(很可能它只是一个寄存器)。

但是,如果hC++ 中的对象类型具有执行编译器无法优化的工作的构造函数/析构函数,则将声明提升到h循环外可能是值得的。

于 2010-06-18T05:52:56.067 回答
2

正如其他人所指出的那样,这个例子很糟糕。

否则,不使用范围,因为它在任何地方都有意义 - 编写函数更有意义。

于 2010-06-18T06:53:12.620 回答