gpt4 book ai didi

c# - 为什么 "while"在 C# 中如此流行?

转载 作者:太空狗 更新时间:2023-10-29 23:57:06 26 4
gpt4 key购买 nike

问题字段有点太短,无法提出我真正的问题。如果有人能更好地概括它,请随意。

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

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

我的第二个问题是:为什么更喜欢第一个?它与可读性有关吗?现在我不相信第一种形式比 for-form 更易读,一旦你习惯了它,可读性在这些结构中是一个主观的项目,当然,你最常用的看起来更具可读性,但我可以向所有人保证,for 形式至少具有可读性,因为它在一行中包含所有内容,您甚至可以阅读构造中的初始化。

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

        // 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);

最佳答案

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

string line;
while ( (line = reader.ReadLine()) != null)
...

int bytesRead;
while ( (bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
...

现在这两个对我来说都非常惯用,不会给我带来任何问题 - 正如我所说的,它们让我只能陈述每个逻辑片段一次。

如果你不喜欢变量的范围太大,你可以引入一个额外的 block :

{
int bytesRead;
while ( (bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
// Body
}
}

就我个人而言,我不倾向于这样做 - “太宽”的范围不会让我感到困扰

我怀疑编写一个方法来封装所有这些不会太难。像这样的东西:

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

请注意,对于行阅读,我有一门类(class)可以帮助:

foreach (string line in new LineReader(file))
{
// body
}

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

关于c# - 为什么 "while"在 C# 中如此流行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/763233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com