Почему выражение всегда верно для «блокировки с двойной проверкой»?

У меня есть одноэлементный объект 'Service' и два метода для его инициализации и освобождения:

public class BaseService
{
    protected static readonly object StaticLockObject = new object();
}

public abstract class WebServiceBase<TService> : BaseService
    where TService : System.Web.Services.Protocols.SoapHttpClientProtocol, new()
{
    protected static void EnsureServiceIsOpened()
    {
        if (Service == null)
        {
            lock (StaticLockObject)
            {
                if (Service == null)
                {
                    Service = new TService();
                }
            }
        }
    }

    protected static void EnsureServiceIsClosed()
    {
        if (Service != null)
        {
            lock (StaticLockObject)
            {
                if (Service != null) // Why expression is always true
                {
                    Service.Dispose();
                    Service = null;
                }
            }
        }
    }

Для строки с комментарием resharper (я использую версию 5.1) отображается упомянутое предупреждение ...

Вопрос 1: Почему?

Вопрос 2: Почему не отображается «похожее» сообщение в методе EnsureServiceIsOpened?

Спасибо.

6
задан Kevin LaBranche 18 April 2011 в 21:03
поделиться