为什么我不经常看到更严格的范围界定?

时间:2010-06-18 05:41:38

标签: c# java c scope curly-braces

我发现自己经常限制范围。我发现它使代码更清晰,并允许我更容易地重用变量。这在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 个答案:

答案 0 :(得分: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#的东西:)

答案 1 :(得分:3)

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

答案 2 :(得分: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(很可能它只是一个寄存器)。

但是如果h是C ++中的一个对象类型,它有一个构造函数/析构函数执行了编译器无法优化的工作,那么将h的声明提升到循环之外可能会付出代价

答案 3 :(得分:2)

其他人指出,这个例子很糟糕。

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