DCSIMG
yield - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

yield

 

כמו שהבטחתי בפוסט הקודם אני אראה דרך קצרה יותר לממש את IEnumerable ללא מימוש עצמאי של IEnumerator בעזרת yield.
 
ראשית נראה את הדוגמא ואז את ההסברים:
 
 
הנה המחלקה מהפוסט הקודם:
 

class PersonManager : IEnumerable

{

    private List<Person> _persons;

 

    public PersonManager()

    {

        _persons = new List<Person>();

    }

 

    public IEnumerator GetEnumerator()

    {

 

    }

}

כעת נממש את המתודה בעזרת yield.
 
 

public IEnumerator GetEnumerator()

{

    foreach (var item in _persons)

    {

        yield return item;

    }

}

 
למעשה אפשר פשוט להשתמש בזה, במידה וחשוב לכם לדעת מה קורה מאחורי הקלעים  אתם מוזמנים לפתוח relector ותראו שנוצרת מחלקה שלמה, כשהמתודה העיקרית נראית כך:
 
 

private bool MoveNext()

{

    try

    {

        switch (this.state)

        {

            case 0:

                this.state = -1;

                this.wrap = this.@this._persons.GetEnumerator();

                this.state = 1;

                while (this.wrap.MoveNext())

                {

                    this.item = this.wrap.Current;

                    this.current = this.item;

                    this.state = 2;

                    return true;

                Label_0072:

                    this.state = 1;

                }

                this.m__Finally3();

                break;

 

            case 2:

                goto Label_0072;

        }

        return false;

    }

    finally

    {

        ((IDisposable)this).Dispose();

    }

}

 

,

כשבפעם הראשונה שהמתודה תקרא הערך של state יהיה 0.
 
(לא ברור לי כיצד אפשר ב - case 2 לקרוא ל - Label_0072 כשהוא מוגדר בסקופ של ה - while - אולי למייקרוסופט מותר לעשות דברים שלנו אסור ?)
פורסם: Apr 26 2011, 10:39 AM by Shlomo | with 3 comment(s)
תגים:, ,

תוכן התגובה

Sasha Goldshtein כתב/ה:

כל המשמעות של labels היא שאפשר לקפוץ ביניהם ללא קשר ל- control flow רגיל, כל אימת שזה קורה בתוך אותה מתודה.

ואגב, בדוגמה הזאת לא לגמרי ברור למה לא להשתמש במימוש המוכן של List ל- enumerator במקום לכתוב אחד משלך :-)

# May 2, 2011 8:47 AM

שלמה גולדברג (הרב דוטנט) כתב/ה:

אחד הפיצ&#39;רים הנחמדים שנכנסו ב - C# 3.0 הוא Collection Initializers. עד C# 3.0 יכולנו לכתוב קוד כזה

# May 12, 2011 11:44 AM

שלמה גולדברג (הרב דוטנט) כתב/ה:

אחד מהיכולות החזקות של השפה שאנחנו משתמשים בהם רבות זהו היכולת להפעיל Linq to Objects על כל מי שמממש

# November 25, 2011 11:42 AM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 4 and 5 and type the answer here:


Enter the numbers above: