Sobes.tech
Junior

Τι είναι οι delegates στη C# και για ποιο λόγο χρησιμοποιούνται;

sobes.tech AI

Απάντηση από AI

Οι delegates στη C# είναι τύποι ασφαλών δεικτών σε μεθόδους. Κάπνουν μια μέθοδο, επιτρέποντάς της να μεταβιβαστεί ως παράμετρος ή να χρησιμοποιηθεί ως τύπος μεταβλητής.

Χρησιμοποιούνται για:

  • Εφαρμογή του μοτίβου παρατηρητή (Observer): Τα γεγονότα στη C# βασίζονται σε delegates. Ο εκδότης ειδοποιεί τους συνδρομητές καλώντας το delegate.
  • Callbacks: Μεταβίβαση μιας μεθόδου ως ορίσματος σε μια λειτουργία που θα την καλέσει αργότερα.
  • Γενικός προγραμματισμός: Τα delegates Action και Func επιτρέπουν τη δημιουργία γενικών μεθόδων που λειτουργούν με διαφορετικές υπογραφές.
  • Παράλληλος και ασύγχρονος προγραμματισμός: Οι μέθοδοι για εκτέλεση σε άλλα νήματα ή ασύγχρονα συχνά μεταβιβάζονται μέσω delegates.
  • LİNQ: Οι τελεστές LINQ χρησιμοποιούν ενεργά delegates για τον ορισμό συνθηκών φιλτραρίσματος, μετασχηματισμού κ.λπ.

Παράδειγμα δήλωσης και χρήσης delegate:

// Δήλωση delegate με υπογραφή void και ένα όρισμα τύπου int
public delegate void MyDelegate(int x);

public class MyClass
{
    public void PrintNumber(int num)
    {
        Console.WriteLine($"Αριθμός: {num}");
    }

    public static void Main(string[] args)
    {
        // Δημιουργία στιγμιότυπου delegate που δείχνει στη μέθοδο PrintNumber
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Κλήση της μεθόδου μέσω delegate
        del(10);
    }
}

Παράδειγμα με Action (για μεθόδους void χωρίς επιστρεφόμενο αποτέλεσμα):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // Εκτέλεση του περασμένου delegate
    }

    public static void Main(string[] args)
    {
        Action myAction = () => Console.WriteLine("Γειά από Action!");
        new OtherClass().ExecuteAction(myAction);
    }
}

Παράδειγμα με Func (για μεθόδους με επιστρεφόμενο αποτέλεσμα):

using System;

public class ThirdClass
{
    public int Calculate(Func<int, int, int> operation, int a, int b)
    {
        return operation(a, b); // Εκτέλεση της περασμένης λειτουργίας και επιστροφή αποτελέσματος
    }

    public static void Main(string[] args)
    {
        Func<int, int, int> add = (x, y) => x + y;
        int result = new ThirdClass().Calculate(add, 5, 3);
        Console.WriteLine($"Αποτέλεσμα πρόσθεσης: {result}");
    }
}