2015-10-18 20 views
5

C#コードを見直して、コードブロック内でスコープしていた関数レベルで範囲指定された変数を見つけましたケース)を使用します。私にとってはスコープの近くにスコープがあるのは、よりクリーンで理性的な理由だけです。ブロックレベルのスコープを好むほどの理由です。しかし、私は何か大きなパフォーマンスの影響があるかどうか疑問に思っていましたか?.NETのブロックレベルと関数レベルのスコープにパフォーマンスに影響がありますか?

+0

Twouldは、ループや変数のサイズに依存します –

+0

関連http://programmers.stackexchange.com/questions/113262/why-declare-variables-close-to-where-the-are-used – Rotem

+0

@AlexKrupsそれでしょうか?私は、コンパイラが宣言をループから取り除くと思います。 – Rotem

答えて

8

パフォーマンスの違いはまったくありません。

可変スコープは変数ライフタイムとは異なります。変数は、関数スコープ内または関数内のコードブロック内で宣言されているかどうかにかかわらず、関数のスタックフレーム内に作成されます。この変数は関数の実行中に存在しますが、そのスコープに応じて変数へのアクセスを制限するのはコンパイラだけです。ほとんどの場合、おそらくノー差延 -

(。変数は、実際の代わりに、通常のローカル変数の閉鎖の一部である場合、異なる規則が適用されても注意してください)

+0

もちろん、JITterは、複数の変数に対してレジスタまたはスタックの一部を自由に再利用できます。 – CodesInChaos

+0

それは私が考えた線に沿っていますが、おそらくスコープの違いがガベージコレクションに影響するかもしれないと思っていました。 –

+0

@MatthewNichols:実際にはガベージコレクションには影響しません(デバッグモードを除く)。ガベージコレクタは、コード内で参照が使用されている場所のみを対象にしています。変数の有効範囲と有効期間は関係ありません。 – Guffa

関連する問題