Похоже, что вы заново изобрели бокс (за исключением случаев, когда требуется повышенная безопасность типов).
private volatile object expiryTime = null;
private bool IsExpired()
{
object expiry = this.expiryTime;
return expiry == null
|| (DateTime)expiry < DateTime.UtcNow;
}
А вот с типобезопасностью все хорошо.
Вот вещи, которые я бы изменил:
Calculate()
должно быть CalculateIfExpired()
и должно вызывать Calculate()
для выполнения реальной работы.
В настоящее время Calculate
бездельничает с настройкой поля expiryTime
. Почему он должен знать, как установить expiryTime
, когда он не умеет читать expiryTime
? Вместо этого IsExpired()
должен иметь красивый маленький SetExpired()
рядом с ним на полке для инструментов. И код должен притвориться, что expiryTime
находится только в области действия этих двух методов (или создать другой класс, чтобы он не притворялся).
А теперь, наконец, чтобы ответить на ваш вопрос : -)
Я согласен с @Eric Lippert, что базовая блокировка лучше, чем блокировка с двойной проверкой, если только не показано, что она недостаточно хороша. Тем не менее, я думаю, что с двойной проверкой блокировки все в порядке, если вы никогда не забудете пометить управляющую переменную как volatile
. Все проблемы с этим методом, которые я видел, предполагают, что переменная не является изменчивой.