Похоже, что Решарпер делает ошибку в этом анализе. Поскольку Service
не является локальной переменной, он не может знать, что это выражение всегда будет истинным.
Причина, по которой ошибка не появляется в первой версии, вероятнее всего потому, что идиома двойной проверки-блокировки очень распространена, и это ее обычная форма. Вероятно, они проверили этот случай и удалили ошибочное предупреждение.
Техника, отображаемая в EnsureServiceIsClosed
, не распространена, поскольку содержит условие гонки. Другой поток может использовать объект, обозначенный Service
во время или после его удаления. Это было бы невозможно, если код, который использует Сервис, блокируется на StaticLockObject
, но если он действительно берет блокировку, то нет никакой причины делать всю эту двойную проверку блокировки ригамароли вокруг создания и удаления объекта. Следовательно, совершенно очевидно, что этот код является ошибочным.