Delegaty, Multicast

S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

Mam dośyć trywialne pytanie, czemu gdy delegat (działanie) wywołuje wszystkie metody.
To konsola wyświetli Mnozenie, Dodaj, Odejmij, -45. A nie wyświetli wartości zwarcanych przez metody Mnożenie oraz Dodaj.

Kopiuj
using System;

namespace Program
{
    class Program
    {
        
        delegate int Delegat(int x, int y);

        static void Main(string[] args)
        {
            
            int liczbaX = 10;
            int liczbaY = 55;


          
            Delegat dzialanie = Dodaj;
            dzialanie += Mnozenie;
            dzialanie += Odejmij;


            Console.WriteLine("Wynik  {0}", dzialanie(liczbaX, liczbaY));

            Console.ReadKey();
        }

        static int Mnozenie(int x, int y)
        {
            Console.WriteLine("Mnozenie");
            return x * y;
        }
        static int Dodaj(int x, int y)
        {
            Console.WriteLine(Dodaj");
            return x + y;
        }
        static int Odejmij(int x, int y)
        {
            Console.WriteLine("Odejmij");
            return x - y;
        }
    }
}
fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
2

tutaj nie jestem pewien @somekind @katelx powinni widziec lepiej, ale wydaje mi sie, ze delegat moze zwrocic tylko jedna rzecz. Bo jezeli zwroci trzy obiekty, to do czego ma to byc przypisane? Jak to ma dzialac?

Rozwiazaniem na to jest

  1. nie posiadanie delegatu ktory posiada wszystkie funkcje
  2. dodanie callbacku do delegatu, ktory bedzie zawieral rezultat
SK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 117
1

No tak, może zwrócić tylko jedną rzecz - z ostatnio przypisanej metody.

katelx
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Hong Kong
0

a co chcesz osiagnac? wypisac wyniki roznych dzialan? to zmien troche na:

Kopiuj
using System;

namespace Program
{
    class Program
    {

        delegate void Delegat(int x, int y);

        static void Main(string[] args)
        {

            int liczbaX = 10;
            int liczbaY = 55;

            Delegat dzialanie = Dodaj;
            dzialanie += Mnozenie;
            dzialanie += Odejmij;

	dzialanie(liczbaX, liczbaY);

            Console.ReadKey();
        }

        static void Mnozenie(int x, int y)
        {
            Console.WriteLine("Mnozenie  {0}", x * y);
        }
        
        static void Dodaj(int x, int y)
        {
            Console.WriteLine("Dodaj  {0}", x + y);
        }
        
        static void Odejmij(int x, int y)
        {
            Console.WriteLine("Odejmij  {0}", x - y);
        }
    }
}
somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

Delegaty nie służą do łączenia wywołań funkcji w łańcuchy.

Spróbuj raczej tak:

Kopiuj
var dzialania = new List<Func<int, int, int>> { Dodaj, Mnozenie, Odejmij };
int wynik = dzialania.Aggregate(0, (total, func) => func(liczbaX, liczbaY));
Console.WriteLine("Wynik  {0}", wynik);
neves
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1114
2

Jeśli dany delegat zawiera wskazania na wiele metod i chcemy dostać wszystkie rezultaty a nie tylko ostatni to możemy je wywołać w dokładnie takiej kolejności w jakiej zostały dodane w ten sposób:

Kopiuj
 foreach(Delegat d in dzialanie.GetInvocationList())
 {
     Console.WriteLine("Wynik  {0}", d(liczbaX, liczbaY));
 }

zamiast

Kopiuj
Console.WriteLine("Wynik  {0}", dzialanie(liczbaX, liczbaY));
S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 123
0

Dzięki za odpowiedzi, teraz już wiem :). Akurat to był tylko przykład składania delegatów, interesowało mnie, czemu delegat zwraca tylko wartość ostatnio dodanej metody.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.