Это обычная практика для свойства только для чтения, которое обращается к базе данных - PullRequest
1 голос
/ 18 апреля 2011

Если у меня есть свойство только для чтения для объекта, который заполняет себя через БД, это то, что я должен делать, или есть лучший способ убедиться, что он уже оценен?

private List<Variable> _selectedVariables;
public new List<Variable> SelectedVariables
{
    get
    {
        if (_selectedVariables == null)
        {
            _selectedVariables = SomeFunctionThatCallsDB();
        }
        return _selectedVariables;
    }
}

1 Ответ

2 голосов
/ 18 апреля 2011

Это нормально для одного потока; но у вас будут проблемы, если это произойдет в ситуации, когда вы получите многопоточные.

РЕДАКТИРОВАТЬ: Threadsafing:

Простой шаблон Threadsafe:

private readonly object _objectLock = new object();
private List<T> _someList = null;

public List<T> MyStuff
{
    get
    {
         if(_someList == null)
         {
             lock(_objectLock)
             {
                  if(_someList == null)
                     _someList = LoadFromDB();
             }
         }

         return _someList;
    }
}

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

...