Mam następujący kod w mojej klasieCzy można użyć przypisania równości podczas usuwania członków delegatów w metodzie usuwania?
public class Receiver : IReceiver
{
public event EventHandler Received;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (Received != null)
{
foreach (EventHandler delegateMember in Received.GetInvocationList())
{
Received -= delegateMember;
}
}
}
}
}
Ten kod działa na tym, że kiedy wyrzucać moją klasę wszelkie zdarzenia, które są podłączone do otrzymane razie zostaną usunięte indywidualnie.
Zastanawiałem się, czy zamiast być tak gadatliwy o tym, czy następujące lakoniczne wersja będzie mieć taki sam skutek
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
Received = null;
}
}
Zasadniczo sprowadza się do tego, w jaki sposób przeciążenia operatora zostały stworzone przez Microsoft, gdy wdrażanie przeciążenia uczestników. Wiem, że cała dokumentacja mówi, aby użyć + = do subskrybowania i - = aby zrezygnować z subskrypcji. Widziałem także, że dokument mówi, że zdarzenie zostanie przypisane wartości zerowej, gdy ostatni subskrybent zostanie usunięty. Czego dokumentacja nie mówi, czy przypisanie zdarzenia do wartości null spowoduje anulowanie subskrypcji wszystkich zdarzeń?
Chciałbym wiedzieć, czy jest to możliwe, a jeśli istnieje jakakolwiek dokumentacja, która mówi, że możliwe jest poprawny kod lakoniczny zachowanie.
Aktualizacja:
Robiłem kilka kopanie z kompilatora C# i odkryli, że przypisanie null działa tylko w obrębie klasy, gdy zdarzenie jest zdefiniowane. Funkcje + = i - = są zawsze dostępne zarówno w klasie, jak i poza nią. Prowadzi mnie to do myślenia, że używanie wersji = null jest dopuszczalne. Jest to jednak spekulacja, wciąż nie widziałem żadnej dokumentacji, która stwierdza wyraźnie, że jest to obsługiwana funkcjonalność.
@DStanley Delegaci będą nadal przedstawieniu tych obiektów, tak, ale sam delegat nie będzie już zakorzenione, lub dostępne od korzenia, więc nie byłoby utrzymanie tych obiektów odwołuje żyje. – Servy
Sprawdziłem cicho chwilę przed opublikowaniem pytania. Zasadniczo chodzi o użycie = wersetów za pomocą - =. W MSDN najbliżej znajdującym się na dole tej strony jest https://msdn.microsoft.com/en-us/library/ms366768(v=vs.90).aspx, że null zostanie przypisany, gdy ostatnia instancja programu obsługi zdarzeń jest anulowana. –