9

重複の可能性:
ループの内側または外側で変数を宣言する方が良いですか?

Resharperは私にこれを変更することを望んでいます:

int Platypus;
string duckBill1;
string duckBill2;
string duckBill3;
. . .
using (OracleDataReader odr = ocmd.ExecuteReader()) {
    while (odr.Read()) {
        Platypus = odr.GetInt32("Platypus");
        duckBill1 = odr.GetString("duckBill1");
        duckBill2 = odr.GetString("duckBill2");
        duckBill3 = odr.GetString("duckBill3");
        switch (Platypus) {
        . . .

...これに:

using (OracleDataReader odr = ocmd.ExecuteReader()) {
    while (odr.Read()) {
        int Platypus = odr.GetInt32("Platypus");
        string duckBill1 = odr.GetString("duckBill1");
        string duckBill2 = odr.GetString("duckBill2");
        string duckBill3 = odr.GetString("duckBill3");
        switch (Platypus) {
        . . .

...しかし、このように(少なくとも、そう思われますが)varsはN回宣言されており、whileループを通過するたびに1回ずつ宣言されています。Resharperizedの方法は、元の方法よりも本当に優れていますか?

4

4 に答える 4

17

はい、宣言された変数の範囲を制限しているので、より良いです。ループ内でそれらを宣言しても、パフォーマンスへの影響はありません。Resharperがこの変更を提案している理由は、ループの外でそれらを使用していないためです。

于 2012-08-16T16:45:47.177 に答える
9

一般的に言って、変数をできるだけ狭い範囲で宣言することは良いプログラミング手法です。理由は次のとおりです。

  1. 情報隠蔽。
  2. 理解しやすい。
  3. 何かを大げさにする可能性は低いです。

変数はループの反復ごとに新しく宣言されているように見えますが、実行時ではなくコンパイル時に宣言されます。変数のスタックフレームにスペースが割り当てられ、その同じスペースがループの各反復で再利用されます。

于 2012-08-16T16:52:22.747 に答える
4

はい。ただし、実行時に宣言するのに時間はかかりません。コンパイラがメモリ位置を再利用するだけなので、メモリを消費しません。

于 2012-08-16T16:49:58.397 に答える
2

変数自体はループ条件に依存しないため、コンパイラは通常、そのような式を最適化し、変数宣言をループの外に「持ち上げ」ます。これにより、最初の例で示したコードが効果的に生成されます。

この場合、Resharperの提案は、プリコンパイルされたスコープを減らすことに加えて、コードの冗長な行を削除することです。

于 2012-08-16T16:48:37.880 に答える