Delegaty, Multicast

Delegaty, Multicast
S9
  • Rejestracja:prawie 11 lat
  • Ostatnio:2 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:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:117
1

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


katelx
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • 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);
        }
    }
}
fasadin
ale wtedy masz logike z wyswietlaniem ;)
katelx
@fasadin ja tam lubie spaghetti ;)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:5 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);
somekind
Po prostu skopiowałem z kodu autora, nie chciało mi się bawić.
neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 12 godzin
  • 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:prawie 11 lat
  • Ostatnio:2 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.