web-dev-qa-db-ja.com

for(;;)またはwhile(true)の正しいC#無限ループはどれですか?

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

while (true)

より自然に感じ、私にとってより明白に見えました

for (;;)

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

90
Bob Kaufman
while(true)
{

}

常に私が使用したものであり、他の人が手動で壊さなければならないループに使用しているのを見たものです。

118
Adam Robinson

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

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

そして

while (true)
{
    // ...
}

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

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

ソース:

。NET Reflector でもう少し混乱し、Visual Studioで「コードの最適化」を使用して両方のループをコンパイルしました。

両方のループがコンパイルされます(.NET Reflectorを使用):

Label_0000:
    goto Label_0000;

猛禽類はすぐに攻撃する必要があります。

300

これは読みやすく、C#で使用するための標準であると確信しています。

while(true)
{
   //Do My Loop Stuff
}
59
RSolberg

Gasp、使用:

while (!false)
{

}

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

while (!false && true)
{
}

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

43
Allen Rice

いくつかの古いジョークを再ハッシュするには:

  1. for (;;) {}」を使用しないでください-ステートメントが泣きます。
  2. もちろん、あなたが「#define EVER ;;」でない限り。
36
Ben Blank

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

STARTOVER:  
    //Do something
    goto STARTOVER;

本当に無限ループの場合、これはgo-toコマンドです。 =)

24
JohnFx

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

20
Marplesoft

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

while(true) {...}

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

10

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

10
Pavel Minaev

元の K&R Cの本。C#からその祖先をトレースできます。

for (;;) ...

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

補遺(2017年2月)

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

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

または:

for (;;)    // Loop forever
    ...
6
David R Tribble

個人的にはfor (;;)イディオム(C/C++の観点から来ます)を好みます。 while (true)はある意味でより読みやすいことに同意しますが(C/C++の場合でも以前に使用した方法です)、次の理由でforイディオムを使用することになりました。

  • 際立っている

ループが(通常の方法で)終了しないという事実は「呼びかける」価値があり、for (;;)はこれをもう少し行うと思います。

6
Michael Burr

それはwhile(true)ではなくwhile(1)でなければならないので、C#ではwhile(1)は間違っています、はい;)

4
JRL

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

while(true)
{

}
2
anishMarokey

あるいは、アプリが本当に永久に実行されない限り終了条件が必要なので、無限ループを持つことは通常、とにかく悪い習慣であると言うことができます。ただし、これが巡航ミサイル用の場合、明示的な終了条件は必要ないかもしれません。

私はこれが好きですが:

for (float f = 16777216f; f < 16777217f; f++) { } 
2
Chris Chilvers

私はもう少し「リテラシー」コードを好む。私は実際にこのようなことをする可能性がはるかに高いです:

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

    shouldContinue = CheckSomething();
}
2
bobbymcr

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

これは、forループ実装が通常のコードとCodeDom生成コードの両方に使用できるという事実以外で、これを選択するかなり緩い理由です。つまり、より標準的です。

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

1
Mark Synowiec

両方とも同じ機能を持っていますが、一般的にはwhile(true)を好みます。読みやすく理解しやすいと思います...

1
abhinav

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

1
sobellian

コードの読みやすさの観点から、while(true)は、私が感じる言語にかかわらず、より理にかなっています。コンピューターがどのようにそれを見るかという点では、今日の非常に効率的なコンパイラーとインタープリターの社会に違いはないはずです。

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

0
Chris

常にtrueを返す式は、whileループで問題ないはずです。

例:

1==1 //Just an example for the text stated before 
true
0
George