46. System Func

בהמשך לשבוע שעבר,

מסתבר שגילו אי שם במיקרוסופט שרוב הdelegateים שאנחנו יוצרים נראים כמו משהו כזה:

1
public delegate bool MyDelegate(string first, int second);

כאשר הפרמטרים יכולים להיות מכל סוג,

בד"כ אין יותר מ4, וגם הReturnType יכול להיות מכל סוג.

לכן החליטו לחסוך מאיתנו לכתוב אלפי delegateים כאלה, ויצרו לנו את הdelegateים הבאים בSystem.Core.dll בnamespace System:

1
2
3
4
5
public delegate TResult Func<TResult>();
public delegate TResult Func<T1, TResult>(T1 arg1);
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);
public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);

יש פה הרבה פרמטרים גנריים, אבל בסופו של דבר זה חוסך לנו הרבה קוד:

למשל במקום הdelegate הזה שראינו בחמישי

1
public delegate int AddDelegate(int first, int second);

נוכל להשתמש בFunc ולכתוב משהו כזה:

1
2
3
4
5
6
Func<int,int,int> add =
(x, y) =>
{
double z = Math.Sqrt(x*x + y*y);
return Convert.ToInt32(z);
};

במקום הdelegate שכתבנו בתחילת המייל, נוכל להשתמש ב

1
2
Func<string, int, bool> stringEqualsNumber =
(str, number) => str.Equals(number.ToString());

הערה: בFramework 4.0 הוסיפו גרסאות של Func לעד 16 ארגומנטים.

שבוע טוב

שתף