属性はどのように[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
(状態が共有されないため)。