היום נדבר על איך עובד foreach בC#.
קיים ממשק שנקרא IEnumerable. לממשק זה פונקציה אחת:
|
|
שמחזירה ממשק אחר שנקרא IEnumerator:
|
|
הממשק הזה מאפשר לנו לעשות 3 פעולות:
- להתקדם אחד קדימה (ולקבל תשובה אם הצלחנו להתקדם אחד קדימה)
- לראות מה האיבר הנוכחי
- לחזור להתחלה
החליטו שכל מי שרוצה שיוכלו לעשות foreach עליו, צריך לממש IEnumerable.
איך זה עובד?
כאשר אנחנו כותבים קוד מהסוג הבא:
|
|
מה שקורה באמת זה משהו כזה:
|
|
כך שבעצם foreach זה כולה syntactic sugar 😃
עכשיו, אפשר להסביר כל מיני דברים, למשל:
איך הוא יודע שהCollection שלי השתנה באמצע הforeach?
ובכן, למשל בList<T>, הפונקציה GetEnumerator, מחזירה איזשהו IEnumerator שמחזיק reference לList. בנוסף יש לשניהם Member שנקרא Version, שכל פעם שמתבצעת פעולה של שינוי על הרשימה (הוספה/הסרה/עדכון וכו’), הוא גדל ב1.
ואז בכל MoveNext, הEnumerator בודק ששני הVersionים שווים, ובמידה ולא, זורק Exception.
שבוע בר מנייה טוב