为什么"while"在C#中如此受欢迎?

Pet*_*ter 4 c# iteration for-loop while-loop

问题领域有点太短,无法提出我真正的问题.如果有人能够更好地概括一下,请随意.

我真正的问题是:我现在在C#中阅读了很多其他人的代码,我注意到一种特定的迭代形式被广泛传播(参见代码).
我的第一个问题是:

所有这些迭代都是等价的吗?

我的第二个是:为什么更喜欢第一个?它与可读性有关吗?现在我不相信第一种形式比for-form更容易阅读,而且可用性在这些结构中是一个主观项目,当然,你最常用的形式似乎更具可读性,但我可以向所有人保证,for-form至少具有可读性,因为它只有一行,你甚至可以阅读构造中的初始化.

因此第二个问题:为什么第三种形式在代码中看得少得多?

        // the 'widespread' construct
        int nr = getNumber();
        while (NotZero(nr))
        { 
            Console.Write(1/nr);
            nr = getNumber();
        }

        // the somewhat shorter form
        int nr;
        while (NotZero(nr = getNumber()))           
            Console.Write(1 / nr);            

        // the for - form
        for (int nr = getNumber(); NotZero(nr); nr = getNumber())
            Console.Write(1 / nr);
Run Code Online (Sandbox Code Playgroud)

dfa*_*dfa 5

这些迭代都是等价的吗?

为什么喜欢第一个?有吧...... 与可读性有关?

因为您可能希望将nr var的范围扩展到while循环之外?

为什么第3种形式在代码中看得少得多?

它是等价的,同样的陈述!您可能更喜欢后者,因为您不想扩展nr变量的范围


Jon*_*eet 5

您显示的第一个和第三个表单重复调用GetNumber.我更喜欢第二种形式,虽然它具有在一定条件下使用副作用的缺点.但是我几乎用while循环来做.通常我不会最终将结果作为参数传递 - 我发现自己常见的情况是:

string line;
while ( (line = reader.ReadLine()) != null)
...
Run Code Online (Sandbox Code Playgroud)

int bytesRead;
while ( (bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
...
Run Code Online (Sandbox Code Playgroud)

这两个现在对我来说都是惯用的,它们不会给我带来任何问题 - 正如我所说,它们只允许我说出一次逻辑.

如果你不喜欢具有太多范围的变量,你可以引入一个额外的块:

{
  int bytesRead;
  while ( (bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
  {
     // Body
  }
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我不倾向于这样做 - "太宽"的范围并不会让我感到烦恼.

我怀疑编写一个方法来封装所有这些并不太难.就像是:

ForEach(() => reader.ReadLine(), // Way to obtain a value
        line => line != null,    // Condition
        line =>
{
    // body
};
Run Code Online (Sandbox Code Playgroud)

请注意,对于读行,我有一个课程有助于:

foreach (string line in new LineReader(file))
{
    // body
}
Run Code Online (Sandbox Code Playgroud)

(它不仅适用于文件 - 它非常灵活.)