Как странный! IE действительно, однако, понимает его при использовании innerHTML вместо методов DOM.
function escapeHTML(s) {
return s.split('&').join('&').split('<').join('<').split('"').join('"');
}
function qualifyURL(url) {
var el= document.createElement('div');
el.innerHTML= '<a href="'+escapeHTML(url)+'">x</a>';
return el.firstChild.href;
}
Немного ужасный, но более краткий, чем Выполнение Его Самостоятельно.
while(true)
{
}
Это всегда то, что я использовал и что я видел, как другие используют для цикла, который нужно разорвать вручную.
С точки зрения читаемости кода while (true)
на любом языке, который я считаю, имеет больше смысла. С точки зрения того, как это видит компьютер, в сегодняшнем обществе очень эффективных компиляторов и интерпретаторов не должно быть никакой разницы.
Если и будет какая-то разница в производительности, я уверен, что перевод на MSIL будет оптимизирован. Вы можете проверить это, если действительно захотите.
Любое выражение, которое всегда возвращает истину, должно подходить для цикла while.
Пример:
1==1 //Just an example for the text stated before
true
Единственная причина, по которой я бы сказал for (;;)
, связана с ограничениями CodeDom (в то время как циклы не могут быть объявлены с помощью CodeDom, а циклы for рассматриваются как более общая форма как итерационный цикл).
Это довольно слабая причина для выбора этого, за исключением того факта, что реализация цикла for
может использоваться как для обычного кода, так и для кода, сгенерированного CodeDom. То есть, он может быть более стандартным.
В качестве примечания, вы можете использовать фрагменты кода для создания цикла while
, но весь цикл должен быть фрагментом ...
Даже я также говорю, что нижеследующий лучше :)
while(true)
{
}
Я предпочитаю немного больше «грамотный» код. На практике я с гораздо большей вероятностью поступлю так:
bool shouldContinue = true;
while (shouldContinue)
{
// ...
shouldContinue = CheckSomething();
}
В качестве альтернативы можно было бы сказать, что наличие бесконечного цикла в любом случае обычно является плохой практикой, поскольку для этого требуется условие выхода, если приложение действительно не работает вечно. Однако, если это для крылатой ракеты, я соглашусь, что явное условие выхода может не потребоваться.
Хотя мне нравится это:
for (float f = 16777216f; f < 16777217f; f++) { }
Это должно быть while (true)
не while (1)
, поэтому while (1)
неверно в C # , да;)
Оригинальная книга K&R для C, из которой C # может проследить его происхождение, рекомендуется
for (;;) ...
для бесконечных циклов. Это недвусмысленно, легко читается и имеет долгую и благородную историю.
Приложение (февраль 2017 г.)
Конечно, если вы думаете, что эта циклическая форма (или любая другая форма) слишком загадочна , вы всегда можете просто добавить комментарий .
// Infinite loop
for (;;)
...
Или:
for (;;) // Loop forever
...
Лично я предпочитаю для (;;)
идиомы (исходя из точки зрения C / C ++). Хотя я согласен с тем, что while (true)
в некотором смысле более читабелен (и это то, что я использовал еще когда-то даже в C / C ++), я обратился к использованию для
идиома, потому что:
Я думаю, что тот факт, что цикл не завершается (обычным образом), заслуживает «вызова», и я думаю, что for (;;)
делает это немного больше.
Лично я всегда предпочитал вместо (;;)
именно потому, что он имеет нет условия (в отличие от while (true)
, у которого есть всегда верный). Однако на самом деле это очень незначительный аспект стиля, о котором, как мне кажется, не стоит спорить. Я еще не видел руководства по стилю C #, которое предписывало или запрещало любой подход.
В тех ситуациях, когда мне нужен настоящий бесконечный цикл, я всегда использовал
while(true) {...}
Кажется, он лучше выражает намерение, чем пустой оператор for.
Если вы хотите следовать старой школе, goto по-прежнему поддерживается в C #:
STARTOVER:
//Do something
goto STARTOVER;
Для действительно бесконечного цикла это команда перехода. =)
Перефразируя пару старых шуток:
для (;;) {}
" - это заставляет оператор плакать. #define EVER ;;
". Компилятор C # преобразует оба
for(;;)
{
// ...
}
и
while (true)
{
// ...
}
в
{
:label
// ...
goto label;
}
CIL для обоих одинаковый. Большинство людей считают, что , а (true)
легче читать и понимать. for (;;)
довольно загадочен.
Я немного испортил .NET Reflector , и я скомпилировал оба цикла с помощью «Оптимизирующего кода» в Visual Studio.
Оба цикла компилируются в (с .NET Reflector):
Label_0000:
goto Label_0000;
Gasp, используйте:
while (!false)
{
}
ИЛИ, как указал jsight , вы можете быть уверены вдвойне:
while (!false && true)
{
}
Перед люди кричат на меня, это все тот же код CIL, я проверил :)
Если вы играете в гольф, я бы предложил вместо (;;)
. Кроме того, while (true)
имеет то же значение и кажется более интуитивным. В любом случае, большинство программистов, вероятно, поймут оба варианта, так что это не имеет особого значения. Используйте то, что вам удобнее.
I think that this may be easier to read and is definitely the standard for use in C#:
while(true)
{
//Do My Loop Stuff
}