Я немного расширю свой комментарий, который гласит:
Я только начал использовать Lazy и обнаружил, что это часто свидетельствует о плохом дизайне;или лень со стороны программиста.Кроме того, одним из недостатков является то, что вы должны быть более бдительными с переменными в области видимости и создавать правильные замыкания.
Например, я использовал Lazy<T>
для создания страниц, которые пользователь может видеть намое ( безсессионное ) приложение MVC.Это ведущий мастер, поэтому пользователь может захотеть перейти на произвольный предыдущий шаг.Когда рукопожатие выполнено, создается массив из Lazy<Page>
объектов, и если пользователь указывает в качестве шага, эта точная страница оценивается.Я считаю, что это обеспечивает хорошую производительность, но есть некоторые аспекты, которые мне не нравятся, например, многие из моих foreach
конструкций теперь выглядят так:
foreach(var something in somethings){
var somethingClosure = something;
list.Add(new Lazy<Page>(() => new Page(somethingClosure));
}
Т.е. вам приходится иметь дело сПроблема закрытия очень активно.В противном случае, я не думаю, что это плохой удар по производительности - хранить лямбду и оценивать ее при необходимости.
С другой стороны, это может указывать на то, что программист Lazy<Programmer>
, в том смысле, чтовы бы предпочли не продумывать вашу программу сейчас, а вместо этого позволить правильной логике оценивать, когда это необходимо, как, например, в моем случае - вместо того, чтобы создавать этот массив, я мог бы просто выяснить, какой будет конкретная запрашиваемая страница;но я решил быть ленивым и делать все в подходе.
РЕДАКТИРОВАТЬ
Мне кажется, что Lazy<T>
также имеет несколько особенностей при работе с параллелизмом,Например, есть ThreadLocal<T>
для некоторых сценариев и несколько конфигураций флагов для вашего конкретного многопоточного сценария.Вы можете прочитать больше на msdn .