2011-02-04 4 views
16

Кто-нибудь знает, почему Microsoft не включила метод Clear() или свойство IsDirty или что-то подобное в класс Lazy < T> в .NET Framework 4.0? (Обновленный вопрос ниже)Lazy <T> метод повторной инициализации?

У нас есть тип доморощенного, который мы используем с .NET 3.5, где я работаю, что делает то же самое, что и Lazy < T> класс, но позволяет повторить оценку экземпляра Lazy Func , Мы хотели бы заменить наш класс новым .NET, но этот механизм Clear() или IsDirty не существует.

Позвольте мне перефразировать исходный вопрос на основе комментариев. Есть ли способ повторной инициализации метода Lazy < T> Func без повторного инициализации класса? Если нет, есть ли способ реализовать его как метод расширения или просто просто плохой шаблон, который следует в первую очередь?

+7

«Почему не было» вопросы - это просто напыщения. Можете ли вы перефразировать это более конструктивно? –

+0

Добавить метод расширения ... –

+0

Я думаю, потому что это должно рассматриваться как значение, а другое значение - не одно и то же. – Skurmedel

ответ

10

Потому что невозможно сделать его потокобезопасным. Классы, которые гарантируют, что программист будет снимать ногу без каких-либо средств для исправления проблемы, не входят в рамки. Вы свободны снимать свою собственную ногу.

+2

Thread-safety - это вариант для класса Lazy - и, возможно, даже не по умолчанию. Следовательно, этот ответ не очень подходит. – flq

+1

Почему это невозможно, чтобы сделать его потокобезопасным? Разве это не просто обновление внутри блока блокировки и некоторые дополнительные блокировки для двух свойств ('IsValueCreated' и' Value')? Я не эксперт по многопоточности, но это кажется возможным с первого взгляда ... – user2173353

1

Is IsValueCreated не работает для вас?

+1

IsValueCreated is readonly ... это было бы, если свойство имело сеттер и вызвало повторную инициализацию при следующем использовании. –

6

Что вы хотите сделать, это не ленивая инициализация, это что-то еще. Вот почему это не на классе Lazy<T>.

4

Потому что это нарушит семантику типа. Если состояние Lazy<T> становится недействительным с течением времени, вам нужно рассмотреть другой тип.

2

Если вам действительно нужно сбросить свой объект Lazy <>, вам необходимо создать механизм для создания нового экземпляра Lazy <> type. Вы можете создать оболочку, которая предоставляет те же свойства, что и Lazy <> type plus Reset-метод, который просто воссоздает его. Проще говоря, это было бы что-то вроде:

public class ResettableLazy<T> 
{ 
    public T Value => this.Container.Value; 
    public bool IsValueCreated => this.Container.IsValueCreated; 
    public void Reset() { this.Container = new Lazy<T>(); } 
    private Lazy<T> Container = new Lazy<T>(); 
} 

Реальный вопрос вы должны сделать что-то подобное, но если вам действительно нужно, что может быть достаточно для ваших нужд.

Смежные вопросы