2011-05-01 119 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