Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

C# – פונקציות הרחבה

C#
C#

בפונקציות הרחבה ניתן להשתמש על מנת להרחיב יכולות של טייפים\מחלקות וכו' בתוכנית שלנו, מדובר בכלי שימושי שיכול לפתור לנו שלל בעיות.
במאמר זה נלמד איך ליצור ולהטמיע פונקציית הרחבה בתכנית שלנו על ידי שימוש במספר דוגמאות.

פונקציות הרחבה ל-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 זה.

Extension Method
Extension Method

ואם נפעיל את התוכנית נקבל את הפלט הבא:

3125
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()}");
}

על מנת שנוכל לקבל את הפלט הבא:

IEnumerable Extension Method
IEnumerable Extension Method

דוגמאות נוספות ניתן לראות במאמרים – איך להשתמש בלולאת – foreach עם אינדקסים, איך לבצע איטרציה על מאפייני מחלקה
לקריאה מורחבת על פונקציות הרחבה באתר של מייקרוסופט יש ללחוץ כאן.

אהבתכם את המדריך? פתר לכם תקלה? הזמינו את כותב המדריך לכוס קפה

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

ניתן לתרום 10, 15, 20 או כל סכום אחר שתרצו באמצעות כרטיס אשראי \ Paypal

רוצים לשתף את המדריך?

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

הזמינו אותי לכוס קפה
buy me coffee

אהבתכם את המדריך? פתר לכם תקלה? הזמינו את כותב המדריך לכוס קפה

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