7

最近、あるオープン ソース プロジェクトのコードを調べたところ、この種のコードが多数見つかった:

class SomeClass
{
    private int SomeNumber = 42;

    public ReturnValue UseSomeNumber(...)
    {
        int someNumberCopy = this.SomeNumber;
        if (someNumberCopy > ...)
        {
            // ... do some work with someNumberCopy
        }
        else
        {
            // ... do something else with someNumberCopy
        }
    }
}

インスタンス変数のコピーを作成するメリットはありますか?

4

6 に答える 6

10

おそらく、これはマルチスレッド プログラムの一部です。このコードはスレッドセーフではありませんが、コピー変数が割り当てられると、別のスレッドによって変更されず、これ以降のすべての関数コードが一貫して実行されることが保証されます。

マルチスレッド環境では、イベントを含む同様のコードが重要になります。

MyEvent e = this.myEvent;

if ( e != null )
{
    e();
}

ここで、ローカルコピーを作成せずに、null のテスト後、呼び出し前にイベントが null になると、null ポインター例外が発生する可能性があります。

于 2010-04-15T13:30:02.210 に答える
8

SomeNumber の値を変更したくなく、someNumberCopy を更新するつもりでない限り、いいえ。回数をループし、カウントを追跡するために someNumberCopy をゼロまでデクリメントする場合と同様です。

そのように変数をコピーすると、外部関数が SomeNumber を変更し、操作の実行中に知らないうちに変更することから保護できると思います。クラスがマルチスレッドアプリケーションで使用されることになっている場合、これが見られる可能性があります。多分彼は私がそれを行う方法ではないかもしれませんが、それは著者の意図であった可能性があります.

于 2010-04-15T13:27:53.213 に答える
1

someNumberCopy// ... do some work with someNumberCopyで何かをしていますか?値を変更していますか?値を変更する可能性のあるメソッドに渡されていますか?

そうでない場合は、何のメリットもありません。

于 2010-04-15T13:28:17.060 に答える
1

あなたはいくつかの重要な詳細を省略しました。
SomeNumber にアクセスする複数のスレッドがあり、このシナリオがある場合:

    int someNumberCopy = this.SomeNumber;
    if (someNumberCopy > x)
    {
        // do some work with someNumberCopy
        // that relies on (someNumberCopy > x) == true
    }

次に、コピーを作成することが重要です。

于 2010-04-15T13:37:00.607 に答える
1

this.SomeNumber別のスレッドで変更できる場合は便利ですが、このメソッドの期間中は、someNumberCopyを変更できないことが重要です ( と同期してSomeNumberいない可能性があります)。そうしないと、理由がわかりません。それのための。

于 2010-04-15T13:38:21.963 に答える
0

私が見る唯一の利点は、そのメソッドのためだけに変数の「読み取り専用バージョン」を持つことです

于 2010-04-15T13:27:35.890 に答える