Ленивый <T>метод повторной инициализации? - PullRequest
20 голосов
/ 05 февраля 2011

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

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

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

Ответы [ 5 ]

9 голосов
/ 05 февраля 2011

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

7 голосов
/ 05 февраля 2011

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

5 голосов
/ 05 февраля 2011

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

3 голосов
/ 21 июня 2016

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

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

1 голос
/ 05 февраля 2011

IsValueCreated у вас не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...