In practice, they mean essentially the same thing. However, it's preferable to use the term deferred.
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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…