2

スコープをかなり頻繁に制限していることに気づきました。これにより、コードがより明確になり、変数をより簡単に再利用できるようになります。これは、新しいスコープの開始時に変数を宣言する必要がある C で特に便利です。

これが私の言いたいことの例です。

{
        int h = 0;
        foreach (var item in photos)
        {
            buffer = t.NewRow();
            h = item.IndexOf("\\x\\");
            buffer["name"] = item.Substring(h, item.Length - h);
            t.Rows.Add(buffer);
        }
}

この例では、反復ごとに初期化せずに h のスコープを制限しました。

しかし、他の多くの開発者がこれを頻繁に行っているのを見たことはありません。何故ですか?これを行うことの欠点はありますか?

4

4 に答える 4

5

その場合、とにかく、「古い」値を使用せずに、すべての反復で新しい値を割り当てているので、次を使用します。

foreach (var item in photos)
{
    buffer = t.NewRow();
    int h = item.IndexOf("\\x\\");
    buffer["name"] = item.Substring(h, item.Length - h);
    t.Rows.Add(buffer);
}

できる限り積極的にそれを行うと(もちろん、合理的な範囲内で)、スコーピングの問題が発生することはあまりないことがわかります-もしそうなら、おそらくメソッドが長すぎることを意味し、リファクタリングする必要がありますとにかくそれ。

古いスタイルの C で役立つ可能性があるとあえて言いますが、C# を書いているときは、C で役立つことを行う理由がわかりませんが、C# を改善しません :)

于 2010-06-18T05:43:26.053 に答える
3

ほとんどの開発者は、スコーピングについてかなり不注意です。私は、「余分な」変数を割り当てる必要がないように、すべてを可能な限り高くスコープする開発者と協力してきました。これは通常、スタック変数を理解していないためにメモリを節約していると人々が考えているためです。それでも、あなたは正しいことをしていますが、foreachループの外側で変数を初期化することによって得られる節約は最小限であり、私はおそらく気にしないでしょう。

于 2010-06-18T05:51:36.797 に答える
3

ブロック内のステートメントの前に変数を宣言する必要があるバージョンのCを使用している場合でも、デバッグ以外のビルドでパフォーマンスに悪影響を与えることはありません。

    foreach (var item in photos)
    {
        int h = 0;
        buffer = t.NewRow();
        h = item.IndexOf("\\x\\");
        buffer["name"] = item.Substring(h, item.Length - h);
        t.Rows.Add(buffer);
    }

hコンパイラーは、の「初期化」が実際には使用されていないことを認識します。そのため、(ループの最初の反復でも)わざわざそれを行うことはありません。コンパイラーは、再割り当てすらしませんh(たぶんそれは単にレジスターになるでしょう)。

ただしh、コンパイラが最適化できない作業を実行するコンストラクタ/デストラクタを備えたC ++のオブジェクト型の場合はh、ループ外の宣言を持ち上げるのにお金がかかる可能性があります。

于 2010-06-18T05:52:56.067 に答える
2

他の人が指摘したように、例は悪いです。

それ以外の場合、どこでも意味があるため、スコープは使用されません-関数を書くことはさらに意味があります。

于 2010-06-18T06:53:12.620 に答える