Ich habe eine Klasse, die eine Methode zur "Registrierung" von Delegaten verfügbar macht (diese Delegaten werden als Teil eines späteren Prozesses aufgerufen). Der an die Methode übergebene Delegat wird in ein kleines Objekt eingeschlossen, das dann einem Wörterbuch hinzugefügt wird. Das Verfahren sieht ein bisschen wie folgt aus: -Sind diese Delegierten Müll gesammelt?
public void Add(int id, Func<bool> someDelegate)
{
var wrapper = new MyDelegateWrapper(someDelegate);
_wrappers.Add(id, wrapper); // _wrappers is a Dictionary<>
}
Einige Zeit später, könnte ich durch den Aufruf einer Methode, wie diese „registrieren de-“ Delegierten entscheiden: -
public void Remove(int id)
{
_wrappers.Remove(id);
}
Ich bin gespannt, wissen, ob dieser Code GC-Probleme einführt. d. h., wird verhindert, dass entweder das "Wrapper" -Objekt oder das Objekt, das den Delegierten erstellt hat, GC'd? Und macht es einen Unterschied, ob die aufrufenden Objekte einen anonymen Delegierten oder eine ihrer eigenen "echten" Methoden übergeben?
Fragen wie diese zu stellen wird nicht auf jede mögliche Situation skalieren. Wenn Sie sich Gedanken über Speicherlecks machen, * profilieren * Sie Ihren Code und sehen Sie, ob Sie tatsächlich Speicherlecks haben. –
Delegierte sind normale .net-Objects, und sie sind GC'd und folgen demselben Lebenszyklus wie jedes andere Objekt. Der von Ihnen bereitgestellte Code führt also zu keinen GC-Problemen. Sowohl Wrapper als auch Delegierte werden gecodiert, wenn kein anderes Objekt sie aufrufen kann. –