c# - Return results from a call to Yield Return -
i find scenario return ienumerable using yield return
statement, have other methods call function different parameters , directly return result.
is there performance benefit iterating through results end yield return
ing these opposed returning collection? i.e. if use return
on resulting ienumberable rather looping through these results again , using yield return
compiler know generate results they're required, or wait entire collection returned before returning results?
public class demo { private ienumerable<int> getnumbers(int x) { //imagine operation more expensive demo version //e.g. calling web service on each iteration. (int = 0; < x; i++) { yield return i; } } //does wait full list before returning public ienumerable<int> getnumberswrapped() { return getnumbers(10); } //whilst allows benefits of yield return persist? public ienumerable<int> getnumberswrappedyield() { foreach (int in getnumbers(10)) yield return i; } }
getnumberswrapped
passes through original enumerable - hasn't invoked iterator @ point. end result remains deferred / lazy / spooling / whatever else.
getnumberswrappedyield
adds extra layer of abstraction - now, every call movenext
has ever slightly more work; not enough cause pain. deferred / lazy / spooling / whatever else - adds minor overheads. these minor overheads justified fact adding value such filtering or additional processing; not in example.
note: 1 thing getnumberswrappedyield
does prevent abuse callers. example, if getnumbers
was:
private ienumerable<int> getnumbers(int x) { return myprivatesecretlist; }
then callers of getnumberswrapped
can abuse this:
ilist list = (ilist)getnumbers(4); list.clear(); list.add(123); // mwahahaahahahah
however, callers of getnumberswrappedyield
cannot this... @ least, not quite easily. could, of course, still use reflection pull iterator apart, obtain wrapped inner reference, , cast that.
this, however, not genuine concern.
Comments
Post a Comment