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 returning 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