GOTO ステートメントを使用して下にジャンプするだけで害はありますか? それとも完全に安全ですか?
つまり、これを私のコードと考えてください。
Some code ...
...
GOTO whereToJump
Some code ...
...
whereToJump:
Some code ...
whereToJump ポイントが常に GOTO ステートメントの下にある場合、セキュリティ上の問題はありますか?
これは、最も有名なコンピューター サイエンスの論文の 1 つの主題です。Dijkstra によって有害と見なされるステートメントに移動します。基本的に、goto を必要とする人は誰もいないと述べています (いつものようにいくつかの例外があることは知っています)。
1968年ですが、今でもとても読みやすいです。
多くの場所から下のコードブロックにジャンプする必要がある場合は、gotoステートメントを使用します。通常、gotoステートメントがない場合は、別の関数を記述して(上記のコードブロックが最初の関数で繰り返されないようにするため)、最初の関数内で呼び出す必要があります。gotoは、if、switchなどで使用されるjumbステートメント(jz、jnzなど)の1つも利用するため、ifまたはswitchステートメントよりも効率的です。
スパゲッティコードの可能性がはるかに少ないのは、下向きのジャンプだけであることは理にかなっています。(私の経験では、従来の GOTO ベースのコードをデバッグする際の頭痛の 75% は、上向きの goto が無秩序なループを引き起こす場合に発生します)
ただし、下向きジャンプのみを使用していることを考えると、非 goto ベースのコードに変換するのは非常に簡単です。gotos がどの程度改善するかはわかりません。
より複雑な例では、GOTO を同じスコープ内で前方にジャンプするためだけに使用することを決定できる場合は、if ステートメントを使用できます。(同じ範囲でないと、本当に「ただのジャンプ」じゃないですよね?)
(そしてもちろん、実際のコードがそれよりも複雑でない場合は、「いくつかのコード...」の 2 番目のブロックを取り除くことができます)。
gotoは、ジャンプする方法に関係なく、コードの安全性を低下させません。
好きなようにコードを構成します。コードが良いか悪いかを決めるのはあなたのコードです。場合によっては goto が適切かもしれません (いいえ、例を示すことはできません :-) )
goto の問題は、プログラムの実行の流れを隠し、コードを混乱させる可能性があることです。しかし、読みやすく保守しやすいコードを作成すれば、それは問題ではありません。
まあ、特に問題はありません。そのコードは次と同等です。
Some code ...
...
if (false)
{
Some code ...
...
}
Some code ...
そうは言っても、私はそれをしません。の適切な使用例goto
は非常にまれであり、他のフロー制御構造は C# ではより慣用的です。
最近 GOTO を避けるべき主な理由は、プログラマーが一般的に GOTO に慣れていないためです (これは良いことです)。したがって、GOTO を多用するコードを作成すると、仲間のプログラマーがそれを理解して拡張するのに苦労する可能性があります。
さらに悪いことに、あちこちで GOTO を使用すると、同僚がどんどん GOTO を使用し始め、大きなボウルのスパゲッティが残ってしまうため、割れ窓症候群につながる可能性があります。
xkcdはそれを最高に言います...