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?
-
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/ms173172When 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.