Sobes.tech
Junior

Mis on delegaadid C#-s ja milleks neid kasutatakse?

sobes.tech AI

Vastus AI-lt

C#-s on delegaadid tüüpi turvalised meetodiviitajad. Nad kapseldavad meetodi, võimaldades seda edastada parameetrina või kasutada muutujatüüpi.

Kasutatakse:

  • Jälgimismustri (Observer) rakendamine: C#-i sündmused põhinevad delegaatidel. Toimetaja teavitab tellijaid, kutsudes välja delegaadi.
  • Tagasikutsed (Callbacks): Meetodi edastamine funktsiooni argumentina, mis seda hiljem kutsub.
  • Üldine programmeerimine: Action ja Func delegaadid võimaldavad luua üldiseid meetodeid, mis töötavad erinevate signatuuridega.
  • Paralleelne ja asünkroonne programmeerimine: Meetodid, mis täidetakse teistes voogudes või asünkroonselt, edastatakse sageli delegaatide kaudu.
  • LİNQ: LINQ operaatorid kasutavad aktiivselt delegaate filtritingimuste, teisenduste jms määratlemiseks.

Delegaadi deklaratsioon ja kasutamise näide:

// Deklaratsioon void signatuuriga ja ühe int argumendiga
public delegate void MyDelegate(int x);

public class MyClass
{
    public void PrintNumber(int num)
    {
        Console.WriteLine($"Number: {num}");
    }

    public static void Main(string[] args)
    {
        // Delegaadile viitava näite loomine, mis osutab PrintNumber meetodile
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Meetodi kutsumine delegaadiga
        del(10);
    }
}

Näide Action-iga (void meetodid):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // täidame edastatud delegaadi
    }

    public static void Main(string[] args)
    {
        Action myAction = () => Console.WriteLine("Tere Action-ist!");
        new OtherClass().ExecuteAction(myAction);
    }
}

Näide Func-iga (meetodid tagastatava väärtusega):

using System;

public class ThirdClass
{
    public int Calculate(Func<int, int, int> operation, int a, int b)
    {
        return operation(a, b); // täidame edastatud operatsiooni ja tagastame tulemuse
    }

    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($"Summa tulemus: {result}");
    }
}