在循环中重新初始化变量的正确位置在哪里?

时间:2009-06-23 20:20:27

标签: c# .net

哪种方法正确?为什么?

string initializeme = string.Empty;
StringBuilder AppendToMe = new StringBuilder();

for(int i=0; i < 10; i++)
{
    initializeme = string.Empty; //Is this the right place to initialize?

    if(expressionThatEvalsTrue)
      initializeme = SomeMethodReturningString();

    if(!string.IsNullOrEmpty(initializeme)
      AppendToMe.Append(initializeme);
}  

string initializeme = string.Empty;
StringBuilder AppendToMe = new StringBuilder();

for(int i=0; i < 10; i++)
{
    if(expressionThatEvalsTrue)
      initializeme = SomeMethodReturningString();

    if(!string.IsNullOrEmpty(initializeme)
       AppendToMe.Append(initializeme);

    initializeme = string.Empty; //Is this the right place to initialize?

}

8 个答案:

答案 0 :(得分:5)

这里有三个因素:

  • 您是要使用lambda表达式还是匿名方法捕获循环中的变量?如果是这样,你想捕获单个变量,还是每次迭代一个单独的变量?
  • 你需要循环后的值吗?
  • 您是否需要循环的下一次迭代中的当前值?

我通常在尽可能小的范围内声明变量,并尝试立即初始化它们:

for(int i=0; i < 10; i++)
{
    string initializeme = expression ? SomeMethodReturningString() : "";    
    Console.WriteLine(initializeme);    
}

答案 1 :(得分:3)

我更喜欢这个:

for(int i=0; i<10; i++)
{
    var initializeme = expression
                         ? SomeMethodReturningString()
                         : string.Empty; 
    Console.WriteLine(initializeme);
}

我更喜欢这种风格的原因是它是自包含的:变量只在一个地方设置。在循环内部进行操作也会减少变量的范围,这也是首选。我喜欢在这种情况下使用额外变量,因为使用三元运算符作为参数IMO会使函数调用的可读性降低。

答案 2 :(得分:2)

现代编译器将代码转换为静态单一赋值形式,其中每个变量只分配一次,因此没有理由不在方便时声明新变量,就像在循环的每次迭代中一样。

答案 3 :(得分:1)

最好的方法就是这样:

for (int i = 0; i < 10; i++)
{
    string initializeme = string.Empty;
    if (expressionThatEvalsFalse)
        initializeme = SomeMethodReturningString();

    Console.WriteLine(initializeme);
}

如果在循环外使用initializeme,则需要在循环外声明它。

答案 4 :(得分:1)

我会在循环中声明变量,并假设编译器足够智能,不会从中创建慢速代码:

for(int i=0; i<10; i++)
{
    string initializeme = string.Empty;
    if(expressionThatEvalsFalse)
      initializeme = SomeMethodReturningString();

    Console.WriteLine(initializeme);
}

答案 5 :(得分:0)

循环完成后你会使用这个变量吗?我能看到的唯一区别是,如果你需要保留该变量的最后一个值,那么第一个值会保留,而第二个值则不会。

答案 6 :(得分:0)

在代码片段中,我认为没有理由首先进行初始化。在初始化可能初始化为值(片段一)或空字符串(片段二)的循环之后,两个片段将不同。因此下面代码的前提是您只需要循环中的initializeme

StringBuilder AppendToMe = new StringBuilder();
for(int i=0; i < 10; i++)
{    
    if(expressionThatEvalsTrue)
      AppendToMe.Append(SomeMethodReturningString());          
}

答案 7 :(得分:0)

在我看来都不是。在这两种情况下,我都会做以下事情。

替换

initializeme = string.Empty; //Is this the right place to initialize?

if(expressionThatEvalsTrue)
  initializeme = SomeMethodReturningString();

使用

initializeme = expressionThatEvalsTrue ? 
  SomeMethodReturningString() : string.Empty

这样,如果你的expressionThatEvalsTrue为true,你将从方法中获取字符串,否则它将被设置为空白。