DCSIMG
Delegate --> Anonymous Methods --> Lambda Expression - שלמה גולדברג (הרב דוטנט)

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

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

Delegate --> Anonymous Methods --> Lambda Expression

 

אנחנו מתקרבים בצעדי ענק ל - C# 4.0, אבל אני נתקל עדיין באנשים (בעיקר סטונדנטים במהלך הלימודים) שמחפשים דוגמא לשלושת האופציות להפעלת delegate.
 
 
אז ככה:
 
ב - 1.1, האופציה היחידה לשליחת מתודה ל - delegate, היתה לכתוב מתודה ולתת אותה אותה כפרמטר ל - delegate,
 
דוגמא ראשונה:
 

        List<int> list = new List<int>();

        private int tmp;

 

        public int Function1(int item)

        {

            tmp = item;

            return list.Find(new Predicate<int>(FindItem));

        }

 

        private bool FindItem(int item)

        {

            return item == tmp;

        }

 
אמנם ב - 1.1 היה קיים רק ArrayList, אבל הרעיון הוא שהדרך היחידה לשלוח פונקציה ל - delegate, היא על ידי יצירת delegate, ושליחת השם של הפונקציה להפעלה.
 
דוגמא שניה:
 

        public void ThreadFunction1()

        {

            Thread thread = new Thread(new ThreadStart(Target));

            thread.Start();

        }

 

        private void Target()

        {

            int i = 0;

            while (true)

            {

                Thread.Sleep(1000);

                Console.WriteLine(i);

                i++;

            }

        }

 
כמו שאפשר לראות בדוגמא הראשונה, החיסרון הגדול של הדרך הזאת, היא שאין לפונקציה המופעלת באמצעות ה - delegate, גישה למשתנים לוקליים של הפונקציה שמתוכה היא הופעלה.
 
ואז ב - 2.2 הגיע לעולם המושג - Anonymous Methods, וכך נראה הקוד.
 
דוגמא ראשונה.
 

        public int Function2(int item)

        {

            return list.Find(delegate(int i)

            {

                return i == item;

            });

        }

דוגמא שניה:
 

        public void ThreadFunction2()

        {

            Thread thread = new Thread(delegate()

                {

                    int i = 0;

                    while (true)

                    {

                        Thread.Sleep(1000);

                        Console.WriteLine(i);

                        i++;

                    }

                });

 

            thread.Start();

        }

 
 
ואז ב - C# 3.0 הגיע המושג - Lamda Expression, שחוסך את המילה delegate,
וכך נראה הקוד:
 
דוגמא ראשונה:

        public int Function3(int item)

        {

            return list.Find(item1 => item1 == item);

        }

 
דוגמא שניה:

        public void ThreadFunction3()

        {

            Thread thread = new Thread(() =>

            {

                int i = 0;

                while (true)

                {

                    Thread.Sleep(1000);

                    Console.WriteLine(i);

                    i++;

                }

            });

 

            thread.Start();

        }

 
 
 נקודה ששווה לשים לב, זה שהרבה פעמים התחביר של 1.1 הוא הרבה יותר קריא (בעיקר כשלא צריך לכתוב את ה - new, ואפשר לכתוב ישירות)
 
 

        public int Function1(int item)

        {

            tmp = item;

            return list.Find(FindItem);

        }

 
 
מאמר טוב שכתב שחר לגבי חידושים ב - C# 3.0 תוכלו לקרוא כאן.

תוכן התגובה

spiritus asper כתב/ה:

בדוגמה הראשונה והשניה, אין צורך "ליצור delegate" על ידי שימוש ב-new. מספיק רק להעביר את שם הפונקציה והקומפיילר יבין כבר בעצמו מה הולך כאן.

ולגבי Anonymous Methods, הקשר ל-delegates מקרי בהחלט. פשוט מדובר ביכולת חילול קוד של הקומפיילר. אתה אומנם משתמש בקוד במילה "delegate" אבל בפועל אחרי הקימפול נוצרת לך מחלקה שלמה שמכילה את הפונקציה שכתבת + עוד קצת קוד משל עצמה.

כך שבפועל אין כאן באמת שימוש במצביע כזה או אחר לפונקציה. הכל צרוב בקוד.

# May 22, 2009 2:47 PM

Shlomo כתב/ה:

לגבי הדוגמא הראשונה והשניה, אל תשכח שמדובר לגרסת 1.1 שם היינו חייבים לעשות new,

# May 23, 2009 9:40 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 5 and 5 and type the answer here:


Enter the numbers above: