Event in Reflector

Ostatnio rozgryzałam Reflectorem BindingListe natrafiłam na taki kod:
[NonSerialized]
private ListChangedEventHandler onListChanged;
// Events
public event ListChangedEventHandler ListChanged;

protected virtual void OnListChanged(ListChangedEventArgs e)
{
    if (this.onListChanged != null)
    {
        this.onListChanged(this, e);
    }
}

private void Child_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
[...]
        ListChangedEventArgs args = new ListChangedEventArgs(ListChangedType.ItemChanged, lastChangeIndex, propDesc);
        this.OnListChanged(args);
    }
}
Co gorsza oglądałam ten sam kod w Telerikowym JustDecompile, który z kolei nie oznacza [NonSerialized] i jakoś nie potrafiłam tego poskładać.
Ponieważ ten event był dla mnie kluczowy postanowiłam poszukać głębiej.
Znalazłam link do kodu źródłowego .NET 4 (kod jest udostępniany w jednym około 180MB pliku i można go wykorzystać do debuggowania bez uciążliwego ściągania źródeł w trakcie debuggowania. "Step Into .NET Framework 4.0 Source Code".
Okazuje się że interesujący mnie event jest zapisany tak:
[NonSerialized]
private ListChangedEventHandler onListChanged;

public event ListChangedEventHandler ListChanged
{
     add
     {
         onListChanged += value;
     }
     remove
     {
         onListChanged -= value;
     }
}
Niby dość oczywiste a jednak ;)
Oprócz samego zapisu eventa w sposób podobny do Property istotny wniosek jest taki że JustDecompile jest jeszcze młodym narzędziem.

Komentarze

  1. Ciekawe. Wnioski:
    1) Nie należy ufać bezgranicznie 1 narzędziu (tools'y też piszą ludzie)
    2) Należy używać innych podobnych narzędzi.
    3) JustDecompile to najmłodszy reflector na rynku, ale dobrze, niech jest, niech się rozwija, niech rośnie konkurencja, to tylko wyjdzie nam na dobre :)

    OdpowiedzUsuń
  2. No ale nie kumam gdzie tu jest problem w tym poście?

    OdpowiedzUsuń
  3. Problemem jest powiązanie zmiennej onListChanged z eventem ListChanged, którego nie widać na pierwszy rzut oka w kodzie z reflektora, co więcej nie ma pewności że w zapisie "add remove" nie ma dodatkowych sztuczek porobiony, no i zagubienie serializacji jest też łatwe (szczególnie jeśli jej nie widać w JustDecompile)

    OdpowiedzUsuń

Publikowanie komentarza

Popularne posty