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)
这些迭代都是等价的吗?
是
为什么喜欢第一个?有吧...... 与可读性有关?
因为您可能希望将nr var的范围扩展到while循环之外?
为什么第3种形式在代码中看得少得多?
它是等价的,同样的陈述!您可能更喜欢后者,因为您不想扩展nr变量的范围
您显示的第一个和第三个表单重复调用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)
(它不仅适用于文件 - 它非常灵活.)