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

私は理想的には「失敗する」メソッドを望んでいないことを知っていますが、私はyoutubeデータAPIを使用しています。何らかの理由でいくつかの呼び出しが行われています。これはgotoを使用する安全な方法ですか?

これは反復を再試行するための短くて甘い方法のようですが、前にgotoを使用したことはなく、人々はそれを使用しないと言うことを聞いたことがあります。

+0

なぜwhileループですか?それは意図を伝える方が良い...これがヌルである間に、別のものを得る –

+0

それは「安全」ですが、それは良いアイデアであるとは限りません。あなたのコードを読むことの "毎分重量"を最小限にしたい、そしてgotoは不要な重量です。 –

答えて

4

ほとんどのプログラムはgotoなしで表現できます。このループについて

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

一つの良いところは、読者が常にその事後条件を知っていることである:それはあなたがそれが言いたいことはかなり言うのでこの特定のケースでは、ループは、はるかに読みやすい構造でありますこのループが終了する唯一の方法は、xがnull以外になることです。安全性チェックを追加して、メソッドを何回も呼び出さないようにすることもできます。

+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

あなたのgotoは安全ですが、一般的には使用されません。基本的にwhileループの実装を書いています。

しかし、あなたのコードは興味深い形質を持っている、あなたの変数はスコープと割り当てられた、まだループの後に利用できるようにすることができます...簡潔ように行うことができる: - それであるが、しかし

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

興味深い....私はあなたがそれをより簡潔にしたい場合は、whileループまたはヘルパーメソッドに固執するだろう

もちろん、それはnullが返される場合には無限ループであるという追加の問題もあります時間。

関連する問題