Problem mit Multicast-Delegat-Objekten



  • Hi,

    ich habe da ein Problem mit Delegat-Objekten bei dem auch der Dozent ratlos ist.
    Ausgehend von Beispiel 2 von hier
    http://msdn.microsoft.com/de-de/libr...(v=vs.71).aspx
    habe ich ein Test-Programm geschrieben das nicht mit Strings sondern mit zahlen arbeitet.

    Hier erstmal die Klasse mit den Funktionen:

    ************************************************** **************
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Multicast_Delegaten
    {
    class K_Veraendern
    {
    public static int Vergroessern(int 😵
    {
    X = X + 1;
    return (X);
    }

    public static int Verkleinern(int 😵
    {
    X = X - 1;
    return (X);
    }
    }
    }
    ************************************************** **************

    und hier das Hauptprogramm:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Multicast_Delegaten
    {
    class Program
    {
    // Delegat-Deklaration
    delegate int Del(int Zahl);

    static void Main(string[] args)
    {
    int Zahl = 0;

    // Deklaration von Delegat-Objekten
    Del Plus1, Minus1, Plus2, Minus2;
    Plus1 = K_Veraendern.Vergroessern;
    Minus1 = K_Veraendern.Verkleinern;
    Plus2 = Plus1 + Plus1;
    Minus2 = Minus1 + Minus1;

    // Verwenden von Delegat-Objekten
    Zahl = Plus2(Zahl);

    Console.WriteLine("Zahl ist: {0}", Zahl);
    Console.ReadLine();
    }
    }
    }

    Problem: Eigentlich sollte Zahl am Ende gleich 2 sein, da ja eine Verketteung von zwei Inkrements (+1) vorliegt. Ähnlich wie bei dem MS-Beispiel mit den Strings. Es kommt aber für Zahl eine 1 raus.
    Der Dozent meint auch es müsste eigentlich 2 rauskommen, der weiss aber auch nicht woran das liegt.

    Weiss jemand wo das Problem liegt?


  • Administrator

    Wäre noch schön gewesen, wenn du den korrekten Link angegeben und den Code in entsprechende Tags gesetzt hättest.

    Multicast Delegate werden nicht verkettet aufgerufen sondern einfach nacheinander. Das letzte Resultat wird zudem als Rückgabewert verwendet.
    http://msdn.microsoft.com/en-us/library/ms173172

    When allMethodsDelegate is invoked, all three methods are called in order. If the delegate uses reference parameters, the reference is passed sequentially to each of the three methods in turn, and any changes by one method are visible to the next method.

    If the delegate has a return value and/or out parameters, it returns the return value and parameters of the last method invoked.

    Da int zudem ein Valuetype und kein Referencetype ist, wird der Wert jeweils kopiert bei der Übergabe. Dass hier also 1 herauskommt, ist absolut korrekt.

    Grüssli



  • Sorry, wegen dem Link, ist wohl beim kopieren was schiefgelaufen.

    Danke für die schnelle Antwort. 🙂


Anmelden zum Antworten