I prefer using
yield when returning
IEnumerable because code looks really clean — storing the output manually loses this nice look, not mentioning extra wrapper method.
But the look can be misleading when the language design leaves a hole — and I fell into this trap. I used
yield in method that returns not some crucial data, but simply a report about what was not computed. You can read it, display it, or ignore it, your call. The problem is
yield unlike cached result, uses deferred execution. And deferment is based on usage of… the outcome. So if you ignore it (and C# compiler does not make a peep about it), it will be not executed at all.
The lesson for C# devs is this — if it is OK to ignore the outcome of the method (as in my case, just a summary of computation), do not use
yield. Go with storing the output inside the method.