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.