2016-10-25 4 views
1
foreach (var thing in things) 
{ 
    tryagain: 
    string thing.var1 = ThisCanReturnNullSometimes(); 
    if (thing.var1 == null) 
    { 
     goto tryagain; 
    } 
} 

Я знаю, что в идеале вам не нужен метод, который может «провалиться», но я работаю с API данных youtube и по какой-то причине некоторые вызовы просто не проходят.Это безопасный способ использования goto?

Это похоже на короткий и сладкий способ повторного запуска итерации, но я никогда не использовал goto раньше, и я слышал, что люди говорят, что не используют его.

+0

Почему не цикл while? он лучше передает намерение ... пока это нулевое значение, получите еще –

+0

, это «безопасно», но это не значит, что это хорошая идея. вы хотите минимизировать «wtfs в минуту» чтения вашего кода, а goto - ненужный wtf. –

ответ

4

Большинство программ может быть выражено без goto. В данном конкретном случае, цикл является гораздо более удобным для чтения конструкт, потому что он говорит довольно много, что вы хотите сказать:

string x; 
do { 
    x=CanReturnNullSometimes(); 
} while (x==null); 

Одна хорошая вещь об этом цикле, что читатели всегда знают его пост-условие: единственный способ, которым этот цикл может завершиться, состоит в том, что x становится ненулевым. Вы также можете добавить проверку безопасности, чтобы убедиться, что вы не вызываете метод слишком много раз.

+1

так его безопасно или нет? вы не говорите ..... это вопрос –

+0

Это лучше, чем мой метод, так как вам не нужно давать метод дважды. – Steve

+0

Интересный вопрос, если есть больше людей, которые знают о существовании цикла «do-while» или «goto» :) –

-1

Возможно, вам было бы лучше использовать что-то вроде цикла while, чтобы отслеживать состояние вашего метода и продолжать его пробовать. Вы можете добавить максимальную проверку итерации, чтобы убедиться, что она не просто петля навсегда.

string thing.var1 = ThisCanReturnNullSometimes(); 
int iteration = 0; 
while (thing.var1 == null && iteration < 5) 
{  
    Thread.Sleep(5000); // sleep for a bit to give the remove service time to "work" 
    thing.var1 = ThisCanReturnNullSometimes(); 
    iteration++; 
} 

Это будет спать в течение 5 секунд, затем повторите попытку и повторите попытку до 5 раз, прежде чем продолжить.

Конечно, лучший способ - это выяснить, почему ваш метод терпит неудачу, если это общая проблема или что-то, что можно исправить.

0

Ваш прием безопасен, но, как правило, не используется. По сути, вы написали реализацию цикла while.

Но ваш код имеет интересную черту, переменная может быть ограничена и назначенную и по-прежнему будет доступна после цикла ... который может быть сжато сделано, как: -

tryagain: var s = ThisCanReturnNullSometimes(); 
if (s == null) goto tryagain; 

однако, в то время как это интересно .... Я бы придерживался метода while или вспомогательного метода, если бы вы хотели его более кратким

Конечно, у него также есть дополнительная проблема быть бесконечным циклом в случае возврата null время.