Wie yield
implementiert das Muster von lazy loading
?Wie der Ertrag das Muster der Lazy Loading implementiert?
Antwort
Ertrag Implementierung erreicht den Code nicht, bis es benötigt wird.
Zum Beispiel dieser Code:
public IEnumerable<int> GetInts()
{
yield return 1;
yield return 2;
yield return 3;
}
tatsächlich in eine verschachtelte Klasse kompilieren, die IEnumerable<int>
implementiert und der Körper von GetInts()
wird eine Instanz dieser Klasse zurück.
Reflektor Sie sehen können:
public IEnumerable<int> GetInts()
{
<GetInts>d__6d d__d = new <GetInts>d__6d(-2);
d__d.<>4__this = this;
return d__d;
}
bearbeiten - weitere Informationen über GetInts
Implementierung hinzu:
Die Art und Weise diese Implementierung es faul macht basiert auf dem Enumerator
MoveNext()
Methode. Wenn die aufzählbare verschachtelte Klasse generiert wird (<GetInts>d__6d
im Beispiel), hat sie einen Status und für jeden Status ist ein Wert verbunden (dies ist ein einfacher Fall, in fortgeschritteneren Fällen wird der Wert ausgewertet, wenn der Code den Status erreicht). Wenn wir einen Blick in dem MoveNext()
Code von <GetInts>d__6d
nehmen wir den Zustand sehen:
private bool MoveNext()
{
switch (this.<>1__state)
{
case 0:
this.<>1__state = -1;
this.<>2__current = 1;
this.<>1__state = 1;
return true;
case 1:
this.<>1__state = -1;
this.<>2__current = 2;
this.<>1__state = 2;
return true;
case 2:
this.<>1__state = -1;
this.<>2__current = 3;
this.<>1__state = 3;
return true;
case 3:
this.<>1__state = -1;
break;
}
return false;
}
Wenn der Enumerator für das aktuelle Objekt gefragt wird, gibt es das Objekt, das den aktuellen Zustand verbunden ist.
Um zu zeigen, dass der Code nur dann ausgewertet wird, wenn es erforderlich ist man an diesem Beispiel sehen kann:
[TestFixture]
public class YieldExample
{
private int flag = 0;
public IEnumerable<int> GetInts()
{
yield return 1;
flag = 1;
yield return 2;
flag = 2;
yield return 3;
flag = 3;
}
[Test]
public void Test()
{
int expectedFlag = 0;
foreach (var i in GetInts())
{
Assert.That(flag, Is.EqualTo(expectedFlag));
expectedFlag++;
}
Assert.That(flag, Is.EqualTo(expectedFlag));
}
}
hoffe, dass ich es ein bisschen mehr klar. Ich empfehle, den Code mit Reflector zu betrachten und den kompilierten Code zu beobachten, wenn Sie den "yield" -Code ändern.
Wenn Sie mehr darüber wissen wollen, was der Compiler tut, wenn yield return
verwenden, lesen Sie in diesem Artikel von Jon Skeet: Iterator block implementation details
Briljant Redirect, eigentlich. +1 – peSHIr
Grundsätzlich unter Verwendung yield
Aussagen implementated Iteratoren sind in einer Klasse zusammengestellt, die ein state machine implementiert.
Wenn Sie nie foreach
(= iterieren und tatsächlich verwenden) die zurückgegebenen IEnumerable<T>
, wird der Code nie tatsächlich ausgeführt. Und wenn Sie das tun, wird nur der minimale Code ausgeführt, der benötigt wird, um den nächsten zurückzugebenden Wert zu bestimmen, nur um die Ausführung fortzusetzen, wenn ein nächster Wert angefordert wird.
Sie können dieses Verhalten tatsächlich beobachten, wenn Sie einen solchen Code im Debugger einzeln ausführen. Probieren Sie es mindestens einmal aus: Ich denke, es ist aufschlussreich, dass dies Schritt für Schritt geschieht.
- 1. Implizite Lazy Loading vs Explizite Lazy Loading
- 2. Lazy Loading vs Eager Loading
- 3. Lazy Loading - was ist der beste Ansatz?
- 4. UITableView Lazy Loading Optimierung
- 5. Lazy Loading with Ninject
- 6. JFreeChart & Lazy loading
- 7. Android listview lazy loading
- 8. ASP.NET HoverMenuExtender Lazy Loading
- 9. C# Ajax Lazy Loading
- 10. lazy loading und $ ocLazyLoad
- 11. Lazy loading Navigationseigenschaften
- 12. Problem mit Lazy Loading-Implementierung
- 13. Lazy Loading in NHibernate
- 14. Lazy Loading UICollectionView Bilder
- 15. Federdaten Hibernate Lazy Loading
- 16. gwt lazy loading
- 17. Doktrin lazy loading
- 18. jQuery Cycle Lazy Loading
- 19. Lazy loading, Deferred Laden, eifrig Loading LINQ
- 20. Verwendet URLClassLoader Lazy Loading?
- 21. webpack 2 lazy loading
- 22. Schienen 3: Lazy Loading versus Eager Loading
- 23. Hibernate Lazy Loading wirft JsonMappingException
- 24. Entity Framework - Was ist der Unterschied zwischen der Verwendung von Include/eager loading und lazy loading?
- 25. NSCollectionView lazy-loading-ähnliches Verhalten
- 26. Angular 2 Lazy Loading Techniken
- 27. Lazy Loading in Rails 3.2.6
- 28. Frühling, Ruhezustand, Blob lazy loading
- 29. Ist Lazy Loading wirklich schlecht?
- 30. Lazy Loading vermeiden Doctrine Symfony2
@Elisha: bitte geben Sie weitere Informationen über GetInt(). –
@masoud ramezani, weitere Informationen zur untergeordneten Entiler-Klasse GetInt. – Elisha
Vielen Dank für Ihre vollständige Antwort. –