这是访问数据库的只读属性的常见做法吗?



如果我在一个对象上有一个只读属性,通过DB填充自己,这是我应该做的,还是有更好的方法来确保它已经被评估?

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

这对于单个线程来说是很好的;但你会有问题,如果这将是在一个情况下,你有多线程得到。

编辑: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;
    }
}

检查是否设置,然后锁定,然后再次检查以确保覆盖了竞争条件。

最新更新