ThreadStatic属性はどのように機能しますか? 質問する

ThreadStatic属性はどのように機能しますか? 質問する

属性はどのように[ThreadStatic]機能しますか? コンパイラが TLS に値を詰め込んだり取得したりするために何らかの IL を発行すると想定していましたが、逆アセンブリを見ると、そのレベルでは実行されていないようです。

フォローアップとして、これを非静的メンバーに配置するとどうなるでしょうか? ある開発者がそのミスを犯しましたが、コンパイラは警告すら出しません。

アップデート

2 番目の質問の回答は次のとおりです。ThreadStatic を Static C# で変更

ベストアンサー1

[ThreadStatic] 属性はどのように機能しますか?

マークされたフィールドはスレッドスタティックスレッドにアタッチされ、その有効期間はスレッドの有効期間と同等です。

したがって、擬似コードでは、ThreadStaticスレッドにキーと値がアタッチされていることに似ています (意味的には)。

Thread.Current["MyClass.myVariable"] = 1;
Thread.Current["MyClass.myVariable"] += 1;

ただし、構文は少しだけ簡単です。

class MyClass {
  [ThreadStatic]
  static int myVariable;
}
// .. then
MyClass.myVariable = 1;
MyClass.myVariable += 1;

非静的メンバーに配置するとどうなりますか?

無視されていると思います:

    class A {
        [ThreadStatic]
        public int a;
    }
    [Test]
    public void Try() {
        var a1 = new A();
        var a2 = new A();
        a1.a = 5;
        a2.a = 10;
        a1.a.Should().Be.EqualTo(5);
        a2.a.Should().Be.EqualTo(10);
    }

さらに、通常の静的フィールドと比較して、同期メカニズムを必要としないことも言及する価値がありますThreadStatic(状態が共有されないため)。

おすすめ記事