Programozás során különféle adatszerkezeteket használunk különböző célokra, mivel minden kollekciónak más az előnye. A tényleges kollekció implementációtól függetlenül azonban egy közös művelet lehet a kollekcióban tárolt elemek lekérdezése vagy más szóval bejárása.
Ezt a bejárást sajnos nem tudjuk általánosítani, mert a kollekció belső lelki világától függ, de ez nem jelenti azt, hogy ne tudnánk valami absztrakciót ráhúzni, amit aztán egy általánosított kód használhatna.
Erre a problémára ad megoldást az Iterator pattern, amit már használtunk és implementáltunk is. A C#-ban a foreach ciklus az iterator pattern felhasználója és az absztrakciója pedig az Ienumerable<T> interfész, aminek a megvalósításához nyelvi elemünk is van a yield kulcsszó személyében.
A yield lényegében a fordító által kigeneráltatott IEnumerator implementációt fog nekünk gyártani. Erről részletesen a „A foreach működése és az Ienumerable” című fejezetben volt szó, ezért ebben a fejezetben ismételten nem lesz szó a működéséről.
Előnyök
- Single Responsibility. A kollekcióhoz tartozó bejárási algoritmus kiemelhető egy osztályba (
IEnumerator) - Követi az Open/Closed elvet. Új kollekciók és új iterátorok implementálhatóak a már meglévők módosítása nélkül
Hátrányok
- Az iterátor és a
foreachhasználata lassabb lehet, mint más ciklusoké1
-
A .NET 7 egyik újítása volt, hogy a
foreachutasítások által generált kód erősen optimalizálva lett, hogy a sebesség hátrány elhanyagolható mértékű legyen aforciklusokhoz képest. Korábbi .NET verziók esetén azonban általánosan kijelenthető, hogy egyforciklus gyorsabb kódot eredményez.↩