108

C/C++ の時代に戻って、「無限ループ」を次のようにコーディングしました。

while (true)

とは対照的に、より自然に感じられ、私にはより明白に見えました

for (;;)

1980 年代後半のPC-lintとの出会いとその後のベスト プラクティスの議論により、私はこの習慣を断ち切りました。forその後、制御ステートメントを使用してループをコーディングしました。今日、久しぶりに、おそらく C# 開発者として初めて無限ループが必要になったのですが、同じ状況に直面しています。そのうちの 1 つは正しく、もう 1 つは正しくありませんか?

4

20 に答える 20

337

C# コンパイラは両方を変換します。

for(;;)
{
    // ...
}

while (true)
{
    // ...
}

の中へ

{
    :label
    // ...
    goto label;
}

両方の CIL は同じです。ほとんどの人はwhile(true)、読みやすく理解しやすいと感じています。for(;;)かなり不可解です。

ソース:

.NET Reflectorをもう少しいじり、Visual Studio で「コードの最適化」をオンにして両方のループをコンパイルしました。

両方のループは (.NET Reflector を使用して) にコンパイルされます。

Label_0000:
    goto Label_0000;

ラプターはすぐに攻撃する必要があります。

于 2009-09-09T18:14:01.837 に答える
131
while(true)
{

}

常に私が使用してきたものであり、手動で切断する必要があるループに他の人が使用しているのを見てきました。

于 2009-09-09T18:08:14.563 に答える
61

これは読みやすく、間違いなく C# で使用するための標準であると思います。

while(true)
{
   //Do My Loop Stuff
}
于 2009-09-09T18:07:50.663 に答える
53

あえぎ、使用:

while (!false)
{

}

またはjsightが指摘したように、二重に確認したい場合があります。

while (!false && true)
{
}

人々が私に怒鳴る前に、それはすべて同じCILコードです、私はチェックしました:)

于 2009-09-09T18:14:40.210 に答える
38

いくつかの古いジョークを焼き直すには:

  1. " " は使用しないでくださいfor (;;) {}— 文が泣かせます。
  2. もちろん、あなた " #define EVER ;;" の場合を除きます。
于 2009-09-09T18:13:59.980 に答える
27

古い学校に行きたい場合は、goto が C# で引き続きサポートされています。

STARTOVER:  
    //Do something
    goto STARTOVER;

真の無限ループの場合、これが頼りになるコマンドです。=)

于 2009-09-09T18:32:04.250 に答える
21

while (true)もう少し読みやすいと思います。

于 2009-09-09T18:07:48.980 に答える
10

真の無限ループが必要な状況では、常に使用してきました

while(true) {...}

空の for ステートメントよりも意図をよく表しているようです。

于 2009-09-09T18:08:52.360 に答える
10

個人的には、条件がないというfor(;;)理由だけで常に好まれてきました (常に真条件があるのとは対照的に)。while (true)ただし、これは実際には非常にマイナーなスタイル ポイントであり、どちらの方法についても議論する価値はないと思います。いずれかのアプローチを強制または禁止する C# スタイルのガイドラインはまだ見たことがありません。

于 2009-09-09T18:14:48.793 に答える
7

C# の祖先をたどることができる、C 用のオリジナルのK&Rブックが推奨されます。

for (;;) ...

無限ループ用。明確で読みやすく、その背後には長く気高い歴史があります。

補遺 (2017 年 2 月)

もちろん、このループ形式 (またはその他の形式) が難解すぎると思われる場合は、いつでもコメントを追加できます。

// Infinite loop
for (;;)
    ...

または:

for (;;)    // Loop forever
    ...
于 2009-09-09T18:41:45.900 に答える
4

そうであってはならwhile(true)ないwhile(1)のでwhile(1)、C# では正しくありません。はい ;)

于 2009-09-09T18:09:49.537 に答える
2

私はもう少し「読み書きのできる」コードを好みます。私は実際にこのようなことをする可能性がはるかに高いです:

bool shouldContinue = true;
while (shouldContinue)
{
    // ...

    shouldContinue = CheckSomething();
}
于 2009-09-09T18:34:27.490 に答える
2

私も以下の方が良いと言っています:)

while(true)
{

}
于 2009-09-09T19:03:04.523 に答える
1

コードゴルフをしているなら、 をお勧めしfor(;;)ます。それを超えてwhile(true)、同じ意味を持ち、より直感的に見えます。いずれにせよ、ほとんどのコーダーは両方のバリエーションを理解する可能性が高いため、実際には問題になりません。最も快適なものを使用してください。

于 2009-09-15T23:55:28.017 に答える
1

どんな言語でもコードの読みやすさという点ではwhile(true)、より理にかなっていると思います。コンピューターがそれをどのように認識するかという点では、非常に効率的なコンパイラーとインタープリターが存在する今日の社会では、実際には何の違いもないはずです。

パフォーマンスに違いがある場合は、MSIL への変換が最適化されると確信しています。本当にしたい場合は、それを確認できます。

于 2009-09-09T18:10:10.957 に答える
1

私が言う唯一の理由for(;;)は、CodeDom の制限によるものです (while ループは CodeDom を使用して宣言することはできず、for ループは反復ループとしてより一般的な形式と見なされます)。

これは、forループの実装が通常のコードと CodeDom によって生成されたコードの両方に使用できるという事実を除けば、これを選択するかなり大雑把な理由です。つまり、より標準的なものにすることができます。

注意として、コード スニペットを使用してwhileループを作成できますが、ループ全体をスニペットにする必要があります...

于 2009-09-09T18:10:52.047 に答える
1

どちらも同じ機能ですが、一般的には の方が好まれwhile(true)ます。読みやすく分かりやすいと思います...

于 2010-12-04T09:33:46.270 に答える
0

while ループでは、常に true を返す任意の式で問題ありません。

例:

1==1 //Just an example for the text stated before 
true
于 2009-09-09T18:28:00.500 に答える