ThreadLocal属性

时间:2011-05-01 22:29:50

标签: c# properties thread-local

如果我们有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;
    }
}

2 个答案:

答案 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