Es gibt einen relevanten Unterschied.
Die Ausführung von GetByReYielding() wird verzögert ausgeführt (da es sich um einen Iteratorblock handelt). Wenn Sie einen Parameter in GetByReturn() oder GetByReYielding() verwendet haben und diesen Parameter zur Laufzeit auf Nichtigkeit geprüft haben (oder eine andere Validierung durchgeführt haben), wird diese Prüfung sofort ausgeführt, wenn GetByReturn() aufgerufen wird, aber nicht sofort, wenn GetByReYielding() aufgerufen wird ! Die Validierung in GetByReYielding() würde verzögert durchgeführt werden, wenn das Ergebnis iteriert wird. - Das ist oft, naja, "zu spät". Siehe hier:
// Checks parameters early. - Fine. The passed argument will be checked directly when
// GetByReturn() is called.
IEnumerable<int> GetByReturn(IEnumerable<int> sequence)
{
if(null == sequence)
{
throw new ArgumentNullException("sequence");
}
return GetIterator();
}
// Checks parameters in a deferred manner. - Possibly not desired, it's "too" late. I.e. // when the
// result is iterated somewhere in a completely different location in your code the
// argument passed once will be checked.
IEnumerable<int> GetByReYielding(IEnumerable<int> sequence)
{
if(null == sequence)
{
throw new ArgumentNullException("sequence");
}
for(var item in GetIterator())
{
yield return item;
}
}
Herr Skeet dieses Konzept in http://msmvps.com/blogs/jon_skeet/archive/2010/09/03/reimplementing-linq-to-objects-part-2-quot-where-quot.aspx erklärt. Die Standardabfrageoperatoren, die in .Net bereitgestellt werden, verwenden nicht verzögerte Wrapperfunktionen (z. B. Where()), die Parameter prüfen und dann die Kerniteratorfunktion aufrufen (wie ich in meiner Implementierung von GetByReturn() gezeigt habe).
Ich hoffe, das hilft.
Was ist der Vorteil der Nachergiebigkeit? Wenn Sie etwas an den Gegenständen ausführen wollen, werden Sie nicht herumlaufen, richtig? Wenn nicht, warum nicht die kürzere Version verwenden? –
Ich folge aus meinen Experimenten (und IL-Inspektionen), dass die Ausführung von GetByReYielding() selbst verzögert wird (unabhängig davon, wie GetIterator() funktioniert), aber die Ausführung von GetByReturn() nicht. Das ist alles. – Nico