Ich versuche zu verstehen, wie die Kombination von Delegaten funktioniert. Im folgenden Code habe ich die übliche Implementierung von set
(mit einer einfachen Zuweisung, unter Verwendung =
Operator) in eine schlecht geformte (mit dem Operator +=
) geändert.Wie wird die Delegataufrufliste erstellt?
So ist der folgende Code:
using System;
using System.Linq;
class Cooler
{
public void OnTemperatureChanged(float newTemperature) {}
}
class Heater
{
public void OnTemperatureChanged(float newTemperature) {}
}
public class Thermostat
{
private Action<float> _OnTemperatureChange;
public Action<float> OnTemperatureChange
{
get
{ return _OnTemperatureChange; }
set
{
_OnTemperatureChange += value; // note the +=
}
}
public void PrintRegistered()
{
if (OnTemperatureChange != null)
{
foreach (Delegate existingHandler in _OnTemperatureChange.GetInvocationList())
{
Console.WriteLine(existingHandler.Target + "." + existingHandler.Method);
}
}
}
}
class Program
{
public static void Main()
{
Thermostat thermostat = new Thermostat();
Heater heater = new Heater();
Cooler cooler = new Cooler();
thermostat.OnTemperatureChange += cooler.OnTemperatureChanged;
thermostat.OnTemperatureChange += heater.OnTemperatureChanged;
thermostat.PrintRegistered();
}
}
Drucke:
Cooler.Void OnTemperatureChanged(Single)
Cooler.Void OnTemperatureChanged(Single)
Heater.Void OnTemperatureChanged(Single)
Natürlich Wenn ich die set
zu seiner üblichen Implementierung ändern zurück, werden wir eine einzige OnTemperatureChanged
für Cooler
sehen und Heater
.
Ich würde gerne verstehen, warum die Einstellung der Delegierten auf diese Weise in dieser Form der Aufrufliste führte?
Warum würden Sie hier keine Veranstaltung verwenden? Dies ist genau das Szenario, für das Ereignisse konzipiert sind. –
Helter Skelter ist eine nette Episode. – usr