我发现自己经常限制范围。我发现它使代码更清晰,并允许我更容易地重用变量。这在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的范围,而没有在每次迭代中初始化它。
但我没有看到很多其他开发人员经常这样做。这是为什么?这样做有不利之处吗?
答案 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)
其他人指出,这个例子很糟糕。
否则,不使用范围,因为在任何地方都有意义 - 编写函数更有意义。