2016-08-26 11 views
0

だから、なぜそれがこのコードで検出されないコードがあるということです。到達不能コード検出(なぜ?)

 public bool GetKeyPressed(KeyCode key) 
    { 
     for (int i = 0; i < keys.Count; i++) 
      if (keys[i].key == key && keys[i].pressed) 
       return true; 
      else 
       return false; 

     return false; 
    } 

インデックス(i)が明らかに到達できている...なぜ?

+0

あなたの場合を'keys'は2つ以上のキーを含み、最初の繰り返しの後に戻り、あなたの望むキーを決して見つけません。 forループのelseを削除してみてください。 (keys [i] .key == key && keys [i] .pressed) がtrueを返すならば、 'for(int i = 0; i

+0

最初の値だけを評価しているのであれば、なぜループが必要なのでしょうか?キーの一致にかかわらず、最初の評価後にコントロールが呼び出し元に返されます。 –

答えて

4

あなたのコードは一度評価ループ、意志常にリターンしたがって、最初の反復を持っています。

それはあなただけで、欲しいしかし、あなたはは、アレイ内の任意のは、あなたのテストを満たしている場合にtrueを返すようにする(私はここに疑いある)場合には、使用

return keys[0].key == key && keys[0].pressed; 

、と言うものだ場合LINQのAny()jdphenix答えを上の拡大

return keys.Any(k => k.key == key && k.pressed); 
+0

聖なる牛、LINQが美しいです。だから私はここで何をしているのか分かります。 'Any'は、リスト内の検索対象のキーを含む「Any」アイテムを検索していますが、そのキーが押されていることを確認しています...? – tdkr80

+0

基本的には、渡された条件を満たす要素があれば 'enumerable.Any(condition)'は真です。 – jdphenix

0

あなたのコードは2つのコードパスを持ち、1つはifです。もう1つはelseです。これは、コントロールがこれらの2つの方法で機能を残すことを意味します。したがって、elseの後のreturn文はトリガされません。そのため、コンパイラは到達不能なコードとしてそれを指しています。これは、次のコードを使用することで回避できます。

public bool GetKeyPressed(KeyCode key) 
{ 
    for (int i = 0; i < keys.Count; i++) 
     if (keys[i].key == key && keys[i].pressed) 
      return true;   
     return false; 
} 
+0

「私はいくつかの説明を追加しましょう; ---最初に追加して投稿してみませんか? – zerkms

+0

@zerkms:私はこのサイトの専門家が、最初にいくつかの重要な点を追加し、完全な説明で投稿を編集することを見ています。指導者にちょうど従う。そして、一部の人々は説明しないために打撃を受けるだろうが、彼らは編集後にダウンを取り除かないだろう、それが私がその引用を加えた理由だ。 –

+1

@zerkmsレースに勝つためには、最初に試合を始めなければならないことがあります:-) –

0

は、私たちはなぜあなたのループを理解する必要があると思います「は一度と評価されます」というメッセージが表示され、「到達不能なコード」がある理由を理解することができます。

public bool GetKeyPressed(Keys key) 
{ 
    for (int i = 0; i < keys.Count; i++) 
     if (keys[i].key == key && keys[i].pressed) 
      return true; 
     else 
      return false; 

    return false; 
} 

forループは体を構成する単一if-elseの文を持っています。満足すればifガードはtrueを返します。それ以外の場合はelseステートメントを実行してfalseを返します。最終結果は、多くの場合、ループの1サイクルが実行され、keysの項目の数に関係なく、制御が呼び出しメソッドに戻されるということです。

それは我々がJetBrainsのReSharperのを経由して、コードを見れば、より明らかです。ミスをしないでください

public bool GetKeyPressed(Keys key) 
{ 
    for (int i = 0; i < keys.Count;) // Look Ma, no i++ !!! 
     if (keys[i].key == key && keys[i].pressed) 
      return true; 
     else 
      return false; 

    return false; 
} 

enter image description here

コードも同様のように書くことができます。最後のreturn falseは、シナリオ中であるため、このメソッドの最後にある必要はありません。keys.Count == 0

0もちろん

enter image description here

、もう少しきれいにコードをフォーマットすると、最初のreturn falseが冗長であるとun-lucky's answerあたりのように単純化することができないという問題を明らかに長い道のりを行く:

enter image description here

関連する問題