2

如果我们有一个ThreadLocal属性(每个线程都有它的唯一属性),那么哪个是正确的(我们不想使用自动 setter/getter):

一种)

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

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

二)

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

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

2 回答 2

4

我假设您想封装ThreadLocal<T>以便调用者只需要知道MyClass; 在这种情况下,您仍然需要.Value显式访问,因为这是每个线程魔术发生的地方:

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

public MyClass SomeProperty
{
    get { return _someProperty.Value; }
    set { _someProperty.Value = value; }
}
于 2011-05-01T22:33:25.477 回答
2

您应该使用第二种形式,以确保您控制何时设置值。

如果你ThreadLocal直接暴露,你的调用者可以写SomeProperty.Value = null,你将无法阻止它。

通过强制所有访问权限通过您的类,您可以向设置器添加验证。

此外,第一种形式允许一个线程通过替换整个ThreadLocal实例来擦除其他线程上的属性值。

请注意,您的代码不会编译;您需要返回并设置.Value.

于 2011-05-01T22:32:52.377 回答