質問: suryo[i] * tanka[i]; gokei += kingaku; } ``` 上記1の方は、変数`kingaku`の宣言は1回だけなので、内部で メモリの場所を確保したりする回数も1度だけです。 ひとつのメモリを書き換えるだけで済むので、処理は若干早いような気がします。 しかし、for文が終わった後もその変数はスコープを抜けるまで残り続けます。 2の方は、ループ毎に変数`kingaku`を作成していますが、for文を抜けると 変数は破棄されると思います。 例文のようなものなら差は無いでしょうが、大きなプログラムだと 差が出てくるのではないかと思いました。 どちらが良いでしょうか。
回答: こんにちは。 提示された2つのコードでは、後者のほうが明確に良い書き方と言えます。 C#のメソッドは、コンパイルされるときに内部で利用している変数を全て洗い出し、ローカル変数領域のサイズを決定します。このとき変数のスコープは関係ないため、どちらのコードでも同じ数の変数領域が確保されます。 前者のコードでは、後者に比べてローカル変数`kingaku`をループ前に0初期化する処理が余分に存在しています。前者のコードの`int kingaku = 0;`を`int kingaku;`に書き直すと、**前者と後者は全く同じコンパイル結果になります。**とはいえどちらでもJITの段階で同じコードになるのでパフォーマンスへの影響は一切無いですが。 最後に、質問文でも懸念していますが、前者のコードでは変数のスコープが漏れているのが大問題です。スコープの概念はC#のレイヤ上に存在するため、コンパイル結果が等しくなっている以上無用にスコープを拡大する理由はありません。