I recently started using Lazy throughout my application, and I was wondering if there are any obvious negative aspects that I need to take into account when using Lazy<T>?
I am trying to utilize Lazy<T> as often as I deem it appropriate, primarily to help reduce the memory footprint of our loaded, but inactive plugins.
I’ll expand a bit on my comment, which reads:
For example, I’ve used
Lazy<T>to create the pages the user can see in my (sessionless) MVC app. It’s a guiding wizard, so the user might want to go to a random previous step. When the handshake is made, an array ofLazy<Page>objects is crated, and if the user specifies as step, that exact page is evaluated. I find it delivers good performance, but there are some aspects to it that I don’t like, for example many of myforeachconstructs now look like this:I.e. you have to deal with the problem of closures very proactively. Otherwise I don’t think it’s such a bad performance hit to store a lambda and evaluate it when needed.
On the other hand this might be indicative that the programmer is being a
Lazy<Programmer>, in the sense that you’d prefer not thinking through your program now, and instead let the proper logic evaluate when needed, as with example in my case – instead of building that array, I could just figure out just what that specific requested page would be; but I chose to be lazy, and do an all in approach.EDIT
It occurs to me that
Lazy<T>also has a few peculiars when working with concurrency. For example there’s aThreadLocal<T>for some scenarios, and several flag configurations for your particular multi-threaded scenario. You can read more on msdn.