Hi , Could you please let me know what is the exact deference between deferred execution and Lazy evaluation in C#?These two are used synonymously.Could some one please explain the difference with an example??
It's like Jon Skeet read your question and travelled back in time to post the answer in his blog before you even had the question:
Check out Jon Skeets blog post on the subject: http://msmvps.com/blogs/jon_skeet/archive/2010/03/25/just-how-lazy-are-you.aspx
In practice, they mean essentially the same thing. However, it's preferable to use the term deferred.
Lazy means "don't do the work until you absolutely have to."
Deferred means "don't compute the result until the caller actually uses it."
In practice, when the caller decides to use the result of an evaluation (i.e. start iterating through an IEnumerable<T>
), that is precisely the point at which the "work" needs to be done (such as issuing a query to the database).
The term deferred is more specific/descriptive as to what's actually going on. When I say that I am lazy, it means that I avoid doing unnecessary work; it's ambiguous as to what that really implies. However, when I say that execution/evaluation is deferred, it essentially means that I am not giving you the real result at all, but rather a ticket you can use to claim the result. I defer actually going out and getting that result until you claim it.
Please use the term deferred when discussing the subject as it pertains to C#. Lazy is a vaguer version.
Note: Lazy execution/evaluation is different from lazy loading or fetching in the context of a sequence. Lazy loading and eager loading are terms used to describe how elements of a sequence are loaded. When a sequence is loaded lazily, it means that whatever is generating the sequence does just enough work to load one element at a time. When a sequence is eagerly loaded, the entire sequence is loaded all at once and stored in a local buffer. Different usage requirements call for different loading patterns.