C# 在现代面向对象语言中,关键字是否像goto一样过时?

C# 在现代面向对象语言中,关键字是否像goto一样过时?,c#,for-loop,readability,C#,For Loop,Readability,在C#或Java等语言中,for关键字是否过时,或者可能会像goto一样过时?几年后,看到一个面向对象的代码使用作为,会不会感到奇怪和可疑,就像今天,看到转到是非常可疑的 换句话说,是否有任何理由知道并在程序中为使用 我注意到,for有一系列在使用foreach时不存在的缺点: “For”很少使用,我们也很少需要它: 我不了解科学发展,但对于一般的东西,软件产品和网站,尤其是微积分,for很少使用。我看过并做过许多项目,其中数千行代码中没有for循环。甚至在处理微积分时,操作数组、集合、矩阵或

在C#或Java等语言中,
for
关键字是否过时,或者可能会像
goto
一样过时?几年后,看到一个面向对象的代码使用
作为
,会不会感到奇怪和可疑,就像今天,看到
转到
是非常可疑的

换句话说,是否有任何理由知道并在程序中为使用


我注意到,
for
有一系列在使用
foreach
时不存在的缺点:

“For”很少使用,我们也很少需要它: 我不了解科学发展,但对于一般的东西,软件产品和网站,尤其是微积分,
for
很少使用。我看过并做过许多项目,其中数千行代码中没有for循环。甚至在处理微积分时,操作数组、集合、矩阵或范围可能比循环更频繁、更优雅、更有用

在一些地方,似乎需要为
设置
,但实际上并非如此,可以使用面向集合的解决方案

在阅读初学者开发人员的源代码时,我还发现
for
用于做.NET Framework已经做过的事情。例如,要用相同的值填充数组,重复N次,有些人会使用循环,而他们必须使用
Enumerable.Repeat()

有时,我看到循环用于遍历数组、集合或可枚举项
foreach
将是一个更加优雅的解决方案,而且编写时间更短

“For”不是: 可能我是一个非常糟糕的开发人员,但很多时候,当我使用
for
时,我会一次又一次地犯同样的错误:将预定义变量以外的内容放入循环范围,如下所示:

int SomeValue
{
    get
    {
        // Resources-expensive operation goes here.
    }
}

for (int i = 0; i < this.SomeValue; i++)
{
    // Code here.
}

// Instead, a less stupid developer would write:
int someValue = this.SomeValue;
for (int i = 0; i < someValue; i++)
{
    // ...
}
顺便说一下,我觉得第二个更容易理解。两者之间的区别是:

for (i = 0; i < 10; i++)
for (i = 0; i <= 10; i++)
for (i = 1; i < 10; i++)
for (i = 1; i <= 10; i++)
“For”过于严格:
很难为
扩展
。假设我们希望在不使用ASP.NET分页控件的情况下显示网站上的页面列表。最明显的解决方案是使用
for(inti=1;i显示数字,虽然有些人可能不喜欢,但我仍然一直看到它,而且它非常紧凑,而且(在我看来)生成循环的可读方法。我知道在Java中,每个人都使用
进行
循环,事实上我很少看到
foreach
构造。也就是说,总会有人继续使用
进行
循环,也会有人讨厌这些人

关于你的另一个问题,你肯定有必要知道如何做
for
循环(相信我,这并不难),就像您需要知道如何在执行
循环时执行
foreach
可以有效地执行某些操作,因此您偶尔会使用
for
。至于是否使用它,这是您的选择。

在Java(和其他一些语言)中,您仍然使用
for
关键字作为“for each”循环:


所以你可能想重新表述这个问题,但是如果你的意思是“你认为我们会停止使用
吗?”(int i=0;ifor循环的最大问题是当它们嵌套时,我意外地写了一个
i
,而不是
j
,反之亦然…尤其是在for头中,例如在增量或条件部分。幸运的是,我已经训练自己在这种情况下格外小心:D

虽然不是面向对象的,但我认为for循环(大部分)在函数式编程中已经过时了。

我是错了还是应该

for(int i=0;i=someValue;i++)

为了(int i=0;i在我当前的C#项目中,有一个地方仍然使用传统的
for
循环,它处理左右移动数组以找到两条曲线之间的最佳匹配。在这种情况下,
foreach
在语义上根本不足以让陌生人知道发生了什么。这看起来很简单对:

for(int shift = -5; shift <= 5; shift++)
    // shift data and compare

用于(int shift=-5;shift你把它命名为所有通用的OO语言,然后只谈论.NET,当然你不明白为什么你还想使用
for
,我只想说
goto
不是过时的,这是一个很少有用的工具,没错,但偶尔它是最好的解决方案t可读性和可维护性-而不是性能。当使用状态图最好地描述逻辑流时,每个转换的最简单和最清晰的表示形式是goto。问题是,只有当代码不必保存其状态然后稍后恢复时,此参数才有效,在这种情况下,循环开关习惯用法更有意义-但是即使这样,一个单独的线程也可以很容易地挂起自己。另外,在你的
i=someValue
-(1)我假设你的意思是
i==someValue
,并且(2)乐观主义者经常可以帮你从循环中提取它,尽管它通常不会(例如,如果操作符==没有内联,就不知道是否有预期的副作用)@Steve314:这是一个错误:
i=someValue
必须是
i
。在我的情况下(当数据库被查询数千次时),内联是不可能的:编译器无法预测数据库在循环中没有更改。这是一种强烈的自以为是的观点,我建议将其设置为社区wiki。在Python中,for总是迭代,从不计数。但是您有内置的range(),它提供了手动计数的数字。但它的用途仅限于“当您使用它们迭代集合(可以立即迭代)时,“非常不鼓励”。有时,计数正是你想要的-但不经常被作为单独的语法包含。编辑时考虑了delnan的评论。我不明白这是公认的答案的确切原因。它根本没有涉及提出的问题,只是挑剔措辞(和
foreach (string containingTwo in Enumerable.Range(0, 10).
    Where(c => c.ToString().Contains('2')).
    Select(c => c.ToString().PadLeft(8)))
{
    Console.Write(containingTwo);
}
for (String s : myListOfString) { 
    // code code code
}
foreach (var i in Enumerable.Range(0, 10))
{
    // Do something.
}
for (int i = 0; i < 10; i++)
{
    // Do something.
}
for(int shift = -5; shift <= 5; shift++)
    // shift data and compare