Подтвердить что ты не робот

Lazy <T> метод повторной инициализации?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

Если вам действительно нужен reset ваш объект Lazy < > , вам необходимо создать механизм для создания нового экземпляра типа Lazy < > . Вы можете создать оболочку, которая предоставляет те же свойства, что и метод 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>();
}

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

Ответ 5

Не работает ли IsValueCreated для вас?