如果我们有ThreadLocal
属性(每个线程都有它的唯一属性)那么哪一个是正确的(我们不想使用自动setter / getter):
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;
}
}
答案 0 :(得分:4)
我假设你想要封装 ThreadLocal<T>
,这样调用者只需知道MyClass
;在这种情况下,您仍然需要显式访问.Value
,因为这是每线程魔法发生的地方:
private readonly ThreadLocal<MyClass> _someProperty = new ThreadLocal<MyClass>();
public MyClass SomeProperty
{
get { return _someProperty.Value; }
set { _someProperty.Value = value; }
}
答案 1 :(得分:2)
您应该使用第二种形式,以确保您在设置值时进行控制。
如果您直接公开ThreadLocal
,您的来电者可以写SomeProperty.Value = null
,您将无法阻止它。
通过强制所有访问权限通过您的课程,您可以向设置者添加验证。
此外,第一种形式允许一个线程通过替换整个ThreadLocal
实例来擦除其他线程上的属性值。
请注意,您的代码无法编译;您需要返回并设置.Value
。