בפונקציות הרחבה ניתן להשתמש על מנת להרחיב יכולות של טייפים\מחלקות וכו' בתוכנית שלנו, מדובר בכלי שימושי שיכול לפתור לנו שלל בעיות.
במאמר זה נלמד איך ליצור ולהטמיע פונקציית הרחבה בתכנית שלנו על ידי שימוש במספר דוגמאות.
פונקציות הרחבה ל-int
נניח והיה לנו צורך להוסיף יכולת לטייפ int כך שנוכל לבצע עליו פעולה מתמטית קבועה מראש, פעולת חזקה למשל.
קודם נצטרך ליצור פונקציית הרחבה במחלקה סטטית ציבורית.
פתחו פרויקט חדש, והוסיפו לו מחלקה סטטית ציבורית בשם IntExtension.
בתוך מחלקה זו ניצור פונקציה סטטית ציבורית – שהיא פונקציית ההרחבה שלנו בשם Power5,
ופונקציית הרחבה נוספת שבודקת אם המספר הוא ראשוני או לא:
public static class IntExtensions { public static int Power5(this int i) { return (int)Math.Pow(i, 5); } public static bool IsPrimeNumber(this int num) { int flag = 0; int m = num / 2; for (int i = 2; i <= m; i++) { if (num % i == 0) { Console.Write("Number is not Prime."); flag = 1; return false; } } if (flag == 0) { Console.Write("Number is Prime."); } return true; } }
* שימו לב שבפרמטרים של פונקציות ההרחבה נהיה חייבים לציין this לפני הפרמטר שמייצג את הטייפ הנשלח. * המתודות חייבות להיות גם הם סטטיות ונגישות, לא רק המחלקה אשר מכילה אותן.
כעת לטייפ – int יש פונקציות הרחבה אלו, ונוכל להפעיל אותן על כל int שניצור ב-namespace זה.
ואם נפעיל את התוכנית נקבל את הפלט הבא:
Number is Prime
פונקציית הרחבה למערכים
עד עתה ראינו איך ניתן להוסיף פונקציות הרחבה למשתנים פרימיטיביים, כמובן שניתן להוסיף פונקציית הרחבה גם למערכים למשל.
נניח והיינו רוצים להוסיף פונקציית הדפסה הפוכה למערך כפונקציית הרחבה.
נוכל לכתוב אותה כך:
public static class ArrayExtension { public static void PrintReverseArray(this int[] nums) { Array.Reverse(nums); for (int i = 0; i < nums.Length; i++) { Console.WriteLine(nums[i]); } } }
ואם ניצור מערך חדש נוכל להשתמש בפונקציית ההרחבה שייצרנו:
Console.WriteLine("Int Extension Methods:\n"); int num = 5; Console.WriteLine(num.Power5()); num.IsPrimeNumber(); Console.WriteLine("\n\nArray Extension Method:\n"); int[] numbers = { 1, 6, 4, 8, 0, 30 }; numbers.PrintReverseArray();
וכמובן שאם נריץ את התוכנית נקבל את התוצאה הבאה:
Int Extension Methods
3125
Number is Prime
Array Extension Method
30
0
8
4
6
1
פונקציית הרחבה לממשק IEnumerable
נוכל גם להרחיב את יכולותיו של האינטרפייס הגנרי IEnumerable.
לדוגמא נתאר מצב שבו אנו רוצים שבכל פעם שאנחנו רצים על רשימה גנרית מסוג – int בלולאת foreach תתבצע על כל אחד מהאיברים ברשימה פעולת חזקה ובדיקה האם האיבר הוא מספר ראשוני.
נוכל לכתוב את פונקציות ההרחבה שלנו כך למשל:
public static class IEnumerableExtension { public static IEnumerable<int> WithPower5<T>(this IEnumerable<int> source) { return source.Select(item => (int)Math.Pow(item, 5)); } public static bool IsPrimeNumber(this int num) { int m = num / 2; for (int i = 2; i <= m; i++) { if (num % i == 0) { return false; } } return true; } }
כעת נוכל ליצור רשימה ולרוץ עליה בלולאת foreach:
List<int> numbers = new() { 1, 2, 3, 4, 5, 6 }; foreach (int number in numbers.WithPower5<int>()) { Console.WriteLine($"is {number} a prime number - {number.IsPrimeNumber()}"); }
על מנת שנוכל לקבל את הפלט הבא:
דוגמאות נוספות ניתן לראות במאמרים – איך להשתמש בלולאת – foreach עם אינדקסים, איך לבצע איטרציה על מאפייני מחלקה
לקריאה מורחבת על פונקציות הרחבה באתר של מייקרוסופט יש ללחוץ כאן.