C/C++時代に戻り、「無限ループ」を次のようにコーディングします。
while (true)
より自然に感じ、私にとってより明白に見えました
for (;;)
1980年代後半の PC-lint との出会いとその後のベストプラクティスの議論により、私はこの習慣を破りました。それ以来、for
制御ステートメントを使用してループをコーディングしました。今日、久しぶりに、そしておそらくC#開発者としての無限ループが初めて必要になったとき、私は同じ状況に直面しています。そのうちの1つは正しく、もう1つは正しくありませんか?
while(true)
{
}
常に私が使用したものであり、他の人が手動で壊さなければならないループに使用しているのを見たものです。
C#コンパイラは両方を変換します
for(;;)
{
// ...
}
そして
while (true)
{
// ...
}
に
{
:label
// ...
goto label;
}
両方のCILは同じです。ほとんどの人は、while(true)
が読みやすく、理解しやすいと感じています。 for(;;)
はかなり不可解です。
。NET Reflector でもう少し混乱し、Visual Studioで「コードの最適化」を使用して両方のループをコンパイルしました。
両方のループがコンパイルされます(.NET Reflectorを使用):
Label_0000:
goto Label_0000;
これは読みやすく、C#で使用するための標準であると確信しています。
while(true)
{
//Do My Loop Stuff
}
Gasp、使用:
while (!false)
{
}
または jsight が指摘したように、二重に確認したい場合があります。
while (!false && true)
{
}
人々が私に怒鳴る前に、それはすべて同じCILコードです、私はチェックしました:)
いくつかの古いジョークを再ハッシュするには:
for (;;) {}
」を使用しないでください-ステートメントが泣きます。#define EVER ;;
」でない限り。古い学校に行きたい場合、gotoはC#で引き続きサポートされています。
STARTOVER:
//Do something
goto STARTOVER;
本当に無限ループの場合、これはgo-toコマンドです。 =)
while (true)
はもう少し読みやすいと思います。
真の無限ループが必要な状況では、常に使用しています
while(true) {...}
空のforステートメントよりも意図をよりよく表現しているようです。
個人的には、no条件があるので、for(;;)
を常に優先しています(常に真のwhile (true)
とは対照的です)。しかし、これは実際には非常にマイナーなスタイルポイントであり、どちらの方法についても議論する価値はないと思います。いずれかのアプローチを強制または禁止するC#スタイルのガイドラインはまだ見ていません。
元の K&R Cの本。C#からその祖先をトレースできます。
for (;;) ...
無限ループ用。明確で読みやすく、その背後には長く高貴な歴史があります。
補遺(2017年2月)
もちろん、このループ形式(または他の形式)が難解すぎると思う場合は、いつでもコメントを追加できます。
// Infinite loop
for (;;)
...
または:
for (;;) // Loop forever
...
個人的にはfor (;;)
イディオム(C/C++の観点から来ます)を好みます。 while (true)
はある意味でより読みやすいことに同意しますが(C/C++の場合でも以前に使用した方法です)、次の理由でfor
イディオムを使用することになりました。
ループが(通常の方法で)終了しないという事実は「呼びかける」価値があり、for (;;)
はこれをもう少し行うと思います。
それはwhile(true)
ではなくwhile(1)
でなければならないので、C#ではwhile(1)
は間違っています、はい;)
私も以下の方が良いと言っています:)
while(true)
{
}
あるいは、アプリが本当に永久に実行されない限り終了条件が必要なので、無限ループを持つことは通常、とにかく悪い習慣であると言うことができます。ただし、これが巡航ミサイル用の場合、明示的な終了条件は必要ないかもしれません。
私はこれが好きですが:
for (float f = 16777216f; f < 16777217f; f++) { }
私はもう少し「リテラシー」コードを好む。私は実際にこのようなことをする可能性がはるかに高いです:
bool shouldContinue = true;
while (shouldContinue)
{
// ...
shouldContinue = CheckSomething();
}
for(;;)
と言う唯一の理由は、CodeDomの制限によるものです(CodeDomを使用してループを宣言することはできず、forループは反復ループとしてより一般的な形式と見なされます)。
これは、for
ループ実装が通常のコードとCodeDom生成コードの両方に使用できるという事実以外で、これを選択するかなり緩い理由です。つまり、より標準的です。
注として、コードスニペットを使用してwhile
ループを作成できますが、ループ全体をスニペットにする必要があります...
両方とも同じ機能を持っていますが、一般的にはwhile(true)
を好みます。読みやすく理解しやすいと思います...
コードゴルフをしているなら、for(;;)
をお勧めします。それを超えて、while(true)
は同じ意味を持ち、より直感的に見えます。とにかく、ほとんどのコーダーは両方のバリエーションを理解する可能性が高いため、実際には問題ではありません。最も快適なものを使用してください。
コードの読みやすさの観点から、while(true)
は、私が感じる言語にかかわらず、より理にかなっています。コンピューターがどのようにそれを見るかという点では、今日の非常に効率的なコンパイラーとインタープリターの社会に違いはないはずです。
パフォーマンスに違いがある場合は、MSILへの変換が最適化されると確信しています。本当にやりたいなら、それをチェックすることができます。
常にtrueを返す式は、whileループで問題ないはずです。
例:
1==1 //Just an example for the text stated before
true