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 תוכלו לקרוא
כאן.