יצירת מופעים והפעלה של סוגי נציגים

הושלם

סוגי נציגים מיושמים באמצעות התהליך הבא:

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

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

כאשר נציג מופעל, הוא קורא לפעולת השירות(ות) אליהן הוא מצביע, מעביר את כל הארגומנטים שצוינו בחתימה של הנציג.

יצירת מופעים והפעלת נציגים

ניתן ליצור מופעים של נציגים באמצעות שיטות בעלות שם, המרת קבוצת פעולות שירות, שיטות אנונימיות או ביטויי lambda. בחירת שיטת יצירת מופעים תלויה במקרה השימוש הספציפי וברמת הקריאות והשמירה הרצויה.

יצירת מופעים של נציגים באמצעות שיטות בעלות שם

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


public delegate void Notify(string message);

public class Program
{
    public static void Main()
    {
        // Create an instance of the delegate using a named method
        Notify notify = new Notify(NotificationService.SendNotification);

        // Invoke the delegate
        notify("Hello, World!");
    }
}

public static class NotificationService
{
    // Method that matches the delegate's signature
    public static void SendNotification(string message)
    {
        Console.WriteLine("Notification sent: " + message);
    }
}

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

יצירת מופעים של נציגים באמצעות המרת קבוצת שיטות

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


public delegate void Notify(string message);

public class Program
{
    public static void Main()
    {
        // Create an instance of the delegate using a method group conversion for a named method
        Notify notifyMethodGroup = NotificationService.SendNotification;

        // Invoke the delegate
        notifyMethodGroup("Hello from Method Group!");

    }
}

public static class NotificationService
{
    // Method that matches the delegate's signature
    public static void SendNotification(string message)
    {
        Console.WriteLine("Notification sent: " + message);
    }
}


דוגמה זו מדגימה כיצד ליצור מופע נציג באמצעות המרת קבוצת שיטות. פעולת SendNotification השירות מוקצית ישירות למופע הנציג notifyMethodGroup, ומאפשרת להפעיל אותה עם הודעה. כאשר הנציג מופעל, הוא מתקשר לפעולת השירות SendNotification עם ההודעה שסופקה.

יצירת מופעים של נציגים באמצעות שיטות אנונימיות

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


public delegate void Notify(string message);

public class Program
{
    public static void Main()
    {
        // Create an instance of the delegate using an anonymous method
        Notify notifyAnonymous = delegate (string message) { Console.WriteLine("Anonymous notification: " + message); };

        // Invoke the delegate
        notifyAnonymous("Hello from Anonymous Method!");

    }
}

דוגמה זו מדגימה כיצד ליצור מופע נציג באמצעות שיטה אנונימית. השיטה האנונימית delegate (string message) { Console.WriteLine("Anonymous notification: " + message); } מגדירה את אופן הפעולה של הנציג בתוך השורה ומאפשרת להפעיל אותו עם הודעה. כאשר הנציג מופעל, הוא מבצע את הקוד שהוגדר בפעולת השירות האנונימית.

יצירת מופעים של נציגים באמצעות ביטויי Lambda

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


public delegate void Notify(string message);

public class Program
{
    public static void Main()
    {
        // Create an instance of the delegate using a lambda expression
        Notify notifyLambda = (message) => Console.WriteLine("Lambda notification: " + message);

        // Invoke the delegate
        notifyLambda("Hello from Lambda!");
    }
}

דוגמה זו מדגימה כיצד ליצור מופע נציג באמצעות ביטוי lambda. הביטוי lambda (message) => Console.WriteLine("Lambda notification: " + message) מגדיר את אופן הפעולה של הנציג בתוך השורה, ומאפשר לו להיות מופעל עם הודעה. כאשר הנציג מופעל, הוא מבצע את הקוד שהוגדר בביטוי lambda.

הפעלת נציגים של שידור יחיד ונציגים של שידור לקבוצה

נציגים עשויים להיות מופעלים כשיטות רגילות. כאשר נציג מופעל, הוא קורא לפעולת השירות(ות) אליהן הוא מצביע, מעביר את כל הארגומנטים שצוינו בחתימה של הנציג. בקשת נציג דומה להתקשרות ישירה לשיטה.

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

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

האופרטור - יכול לשמש להסרת נציג רכיב מנציג שידור לקבוצה.

הדוגמה הבאה מדגימה כיצד לשלב נציגים באמצעות האופרטור + ולהסיר נציג באמצעות האופרטור - :


using System;

namespace DelegateExamples;

// Define a custom delegate that has a string parameter and returns void.
delegate void CustomCallback(string s);

class TestClass
{
    // Define two methods that have the same signature as CustomCallback.
    static void Hello(string s)
    {
        Console.WriteLine($"  Hello, {s}!");
    }

    static void Goodbye(string s)
    {
        Console.WriteLine($"  Goodbye, {s}!");
    }

    static void Main()
    {
        // Declare instances of the custom delegate.
        CustomCallback hiDel, byeDel, multiDel, multiMinusHiDel;

        // Initialize the delegate object hiDel that references the
        // method Hello.
        hiDel = Hello;

        // Initialize the delegate object byeDel that references the
        // method Goodbye.
        byeDel = Goodbye;

        // The two delegates, hiDel and byeDel, are combined to
        // form multiDel.
        multiDel = hiDel + byeDel;

        // Remove hiDel from the multicast delegate, leaving byeDel,
        // which calls only the method Goodbye.
        multiMinusHiDel = (multiDel - hiDel)!;

        Console.WriteLine("Invoking delegate hiDel:");
        hiDel("Elize Harmsen");

        Console.WriteLine("Invoking delegate byeDel:");
        byeDel("Mattia Trentini");

        Console.WriteLine("Invoking delegate multiDel:");
        multiDel("Peter Zammit");

        Console.WriteLine("Invoking delegate multiMinusHiDel:");
        multiMinusHiDel("Lennart Kangur");
    }
}

/* Output:
Invoking delegate hiDel:
  Hello, Elize Harmsen!
Invoking delegate byeDel:
  Goodbye, Mattia Trentini!
Invoking delegate multiDel:
  Hello, Peter Zammit!
  Goodbye, Peter Zammit!
Invoking delegate multiMinusHiDel:
  Goodbye, Lennart Kangur!
*/

דוגמה זו מדגימה כיצד ליצור נציג שידור לקבוצה על-ידי שילוב שני נציגים ( וhiDel - byeDel) באמצעות האופרטור + . הנציג המשולב () מפעילmultiDel את שתי השיטות כאשר מתבצעת קריאה אליהן. האופרטור - משמש להסרת אחד מהנציגים מהנציג של שידור לקבוצה, כך שרק הנציג האחר יופעל.

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

תרחישים נפוצים לשימוש בנציגים

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

להלן כמה תרחישים נפוצים שבהם נעשה שימוש בנציגים:

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

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

  • תיכנות אסינכרוני: נציגים משמשים להפעלה של פעולות שירות אסינכרוניות. יכולת זו שימושית לביצוע משימות שעשויות להימשך זמן רב, כגון פעולות של I/O של קובץ או בקשות רשת. נציגים מאפשרים לך לציין את פעולת השירות שיש לקרוא לה לאחר סיום הפעולה האסינכרונית.

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

  • הטמעת דפוסי עיצוב: נציגים משמשים בתבניות עיצוב שונות, כגון תבנית האסטרטגיה, שבה ניתן לשנות באופן דינאמי את אופן הפעולה של שיטה בזמן ריצה על-ידי העברת יישומי נציג שונים.

הערה

תרחיש הטיפול באירועים מכוסה במודול נפרד יחד עם מבוא לשימוש באירועים ביישום C# .

נקודות עיקריות

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