Свойство ThreadLocal - PullRequest
       19

Свойство ThreadLocal

2 голосов
/ 02 мая 2011

Если у нас есть свойство 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;
    }
}

Ответы [ 2 ]

4 голосов
/ 02 мая 2011

Я предполагаю, что вы хотите инкапсулировать ThreadLocal<T>, так что вызывающей стороне нужно знать только о MyClass;в этом случае вам все равно необходимо получить прямой доступ к .Value, поскольку именно здесь происходит волшебство для каждого потока:

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

public MyClass SomeProperty
{
    get { return _someProperty.Value; }
    set { _someProperty.Value = value; }
}
2 голосов
/ 02 мая 2011

Вы должны использовать вторую форму, чтобы убедиться, что вы контролируете, когда значение установлено.

Если вы выставите ThreadLocal напрямую, ваш абонент может написать SomeProperty.Value = null, и вы не сможете предотвратить это.

Заставив весь доступ проходить через ваш класс, вы можете добавить проверку в сеттер.

Кроме того, первая форма позволяет одному потоку стирать значения свойства в других потоках, заменяя весь экземпляр ThreadLocal.

Обратите внимание, что ваш код не будет компилироваться; вам нужно вернуться и установить .Value.

...