5

重複の可能性:
C# スレッドセーフの読み取り専用フィールドはありますか?

かなり単純なプログラム

private readonly string _data1;
private readonly int _data2;
private readonly MyAnotherClass _data3;

public MyClass(string data1, int data2, MyAnotherClass data3)
{
    _data1 = data1;
    _data2 = data2;
    _data3 = data3;
}

_data1, _data2 and _data3スレッドセーフですか?

4

4 に答える 4

8

読み取り専用変数は、アクセスされる前に初期化されることが保証されています。初期値は、オブジェクトが完全に割り当てられる前に、オブジェクトの構築中に割り当てられます。

変数初期化子は代入ステートメントに変換され、これらの代入ステートメントは基本クラス インスタンス コンストラクターの呼び出し前に実行されます。この順序付けにより、そのインスタンスにアクセスできるステートメントが実行される前に、すべてのインスタンス フィールドが変数初期化子によって確実に初期化されます。

参照: C# 仕様、10.11.3 コンストラクターの実行 (強調鉱山)

読み取り専用フィールドへの割り当ては、フィールドの宣言の一部として、または同じクラスのコンストラクターでのみ行うことができます

参照: C# 仕様、1.6.5 フィールド

そのため、値はスレッドで使用可能になる前に設定され、変更されないため、スレッドセーフです。

于 2012-11-13T02:55:45.253 に答える
4

はい、クラスが構築されると、ソフトウェアはそれらを変更できないためです。

編集

データ フィールドはスレッド セーフですが、_data3 の内容はスレッド セーフではありません。さまざまなスレッドが _data3 を「同時に」変更する可能性があります。

于 2012-11-13T02:55:49.473 に答える
1

Is a readonly field in C# thread safe?での Joh Skeets の回答 答えのほとんどを提供します-不変型(int/などstring)の場合、スレッドセーフです。

不変の参照ではないカスタム型の場合、それ自体はスレッドセーフになりますreadonlyが、オブジェクトの内容については何も保証しません。したがって、_data3オブジェクトのすべてのプロパティには、カスタム スレッド セーフ保護が必要です。

于 2012-11-13T03:05:15.173 に答える
0

後で変更しない限り、そうです。

編集:

class Class1
{

    readonly string bigbuddy;

    public Class1()
    {

        bigbuddy = "1";

        Thread thread1 = new Thread(SomeThread);
        thread1.Start(this);

        Thread.Sleep(1000);

        bigbuddy = "2";

        Thread thread2 = new Thread(SomeThread);
        thread2.Start(this);

    }

    public void SomeThread(object state) {

        Class1 class1 = (Class1)state;

        Debug.WriteLine(class1.bigbuddy);

    }


}

使用する:

 Class1 asd = new Class1();

出力:

1
The thread '<No Name>' (0xe0c) has exited with code 0 (0x0).
2
The thread '<No Name>' (0x129c) has exited with code 0 (0x0).
于 2012-11-13T02:55:38.817 に答える