ThreadLocal property
本文关键字:property ThreadLocal | 更新日期: 2023-09-27 17:54:00
如果我们有一个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;
}
}
我假设你想封装 ThreadLocal<T>
,这样调用者只需要知道MyClass
;在这种情况下,您仍然需要显式访问.Value
,因为这是每个线程魔术发生的地方:
private readonly ThreadLocal<MyClass> _someProperty = new ThreadLocal<MyClass>();
public MyClass SomeProperty
{
get { return _someProperty.Value; }
set { _someProperty.Value = value; }
}
您应该使用第二种形式,以确保您控制何时设置该值。
如果你直接暴露ThreadLocal
,你的调用者可以写SomeProperty.Value = null
,你将无法阻止它。
通过强制所有访问通过你的类,你可以在setter中添加验证。
另外,第一种形式允许一个线程通过替换整个ThreadLocal
实例来擦除其他线程上的属性值。
注意你的代码将无法编译;您需要返回并设置.Value