2011-05-01 129 views
2

如果我們有一個ThreadLocal屬性(每個線程都有它獨特的屬性),那麼哪一個是正確的(我們不希望使用自動的setter /吸氣):ThreadLocal的財產

A)

private ThreadLocal<MyClass> _someProperty = new ThreadLocal<MyClass>(); 

public ThreadLocal<MyClass> SomeProperty 
{ 
    get 
    { 
     return _someProperty.Value; 
    } 
    set 
    { 
     _someProperty.Value = value; 
    } 
} 

B)

private ThreadLocal<MyClass> _someProperty = new ThreadLocal<MyClass>(); 

public MyClass SomeProperty 
{ 
    get 
    { 
     return _someProperty.Value; 
    } 
    set 
    { 
     _someProperty.Value = value; 
    } 
} 

回答

4

我假設你想封裝ThreadLocal<T>,以便來電者只需要知道MyClass;在這種情況下,你仍然需要訪問.Value明確,因爲這是在每個線程的奇蹟發生:

private readonly ThreadLocal<MyClass> _someProperty = new ThreadLocal<MyClass>(); 

public MyClass SomeProperty 
{ 
    get { return _someProperty.Value; } 
    set { _someProperty.Value = value; } 
} 
+0

有沒有辦法讓在「ThreadLocal的」值不會對_someProperty成員的引用?說你唯一的信息就是線程本身(就像你可以使用'Thread.GetNamedDataSlot(「myDataName」)'從線程獲取數據一樣)。 – Franchesca 2012-06-06 14:15:43

2

你應該使用第二種形式,以確保喲你可以在設定值時進行控制。

如果您直接暴露ThreadLocal,您的呼叫者可以寫SomeProperty.Value = null,並且您將無法阻止它。

通過強制所有訪問經歷你的課程,你可以添加驗證到setter。

此外,第一種形式允許一個線程通過替換整個ThreadLocal實例來擦除其他線程上的屬性值。

請注意,您的代碼不會編譯;您需要返回並設置.Value