2014-10-21 2 views
0

Я видел такой код:Зачем использовать Lazy <T> для перечисления?

readonly Lazy<SomeEnum> _somevar; 

В чем преимущество использования Lazy над перечислением? Само перечисление мало.

+0

В каком контексте вы видели, что это выгодно? – thumbmunkeys

+6

Может быть, небольшой, но дорогой расчет? – Thilo

+0

@thumbmunkeys: Когда объект большой. – Ajay

ответ

2

Как там, кажется, некоторое замешательство, почему это может быть хорошей идеей, вот версия делает то же самое без Lazy:

private SomeEnum? _value = null; 

private SomeEnum CostyCalculation() 
{ 
    return ...; 
} 

public SomeEnum MyVar 
{ 
    get 
    { 
     if (_value == null) 
      _value = CostyCalculation(); 
     return _value.Value; 
    } 
} 

Как вы можете видеть, значение вычисляется только при первом нужно и как только у вас есть это, вам не нужно снова пересчитывать его.

Lazy делает то же самое с небольшим различного синтаксиса/использования:

private Lazy<SomeEnum> _value = new Lazy<SomeEnum>(CostyCalculation); 

    private SomeEnum CostyCalculation() 
    { 
     return SomeEnum.E1; 
    } 

    public SomeEnum MyVar 
    { 
     get 
     { 
      return _value.Value; 
     } 
    } 
0

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

Например, у вас есть объект, который во время создания загружает некоторые веб-страницы, анализирует его, загружает каждую подстраницу, анализирует ее и затем сохраняет некоторые статистические данные в себя. Это займет довольно много времени. Но вы хотите объявить объект сейчас, и, может быть, только, может быть, использовать его последним. Вы можете обернуть его в Lazy<T>, так что этот объект, возможно, может быть, может быть, будет инициализирован последним - когда вы сделаете первый доступ к нему.

Это только преимущество использования Lazy только для создания объекта без него.

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