Event.Raise(this, EventArgs.Empty);

 
19 maart 2008

Zoals elke developer heb ik een hekel aan repeterende code. Als C# developer ben ik nog wel eens jaloers op sommige taal features van Visual Basic .NET. Een voorbeeld hiervan is het vuren van een event. VB.NET heeft hiervoor het RaiseEvent statement. Dit maakt het mogelijk om in VB.NET een event in 1 regel code te vuren:

RaiseEvent Changed(Me, EventArgs.Empty)

Het equivalent in C# kost iets meer code:

//Take a snapshop of the Changed event subscribers. 
var changedEvent = Changed;           
 
// Check if we have subscribers. 
if(changedEvent != null) 
{ 
  // Invoke the delegate for all subscribers. 
  changedEvent(this, EventArgs.Empty); 
}

De extension
Omdat het – in tegenstelling tot class methods – mogelijk is een extension method op een null reference aan te roepen zonder een ArgumentNullException om je oren te krijgen, zijn er in eens meer mogelijkheden dan voorheen. We kunnen boodschappen sturen naar null referenties en kunnen op method nivo bepalen wat voor gedrag daar mee gemoeid gaat.

De volgende extension method voegt de Raise method toe aan alle EventHandler types:

public static class Extensions 
{ 
    public static void Raise(this EventHandler target, Object sender, TEventArgs e) 
    { 
        var targetSnapshot = target;                   
 
        if (targetSnapshot != null) 
        { 
            targetSnapshot(sender, e); 
        } 
    } 
}

Vanaf nu kunnen we events afvuren op de volgende manier en hebben wij het net zo gemakkelijk als VB.NET programmeurs:

Changed.Raise(this, EventArgs.Empty);

Conclusie
C# is nog steeds een getypeerde taal, maar geeft ons steeds meer mogelijkheden die we terugzien komen in dynamische talen. De mogelijkheid om boodschappen naar null referenties te sturen geeft ons tal van extra mogelijkheden. Denk bijvoorbeeld ook aan een fluent interface.


Werken met ?
Kijk dan bij onze mogelijkheden voor starters en/of ervaren IT'ers.


Categorieën: Development

Tags: , ,


Reacties (2)

  • Arjan Keene schreef:

    Fraai! Is een aardige toevoeging voor http://www.extensionmethod.net

    Geplaatst op 20 maart 2008 om 21:05 Permalink

  • Jasper Stein schreef:

    Hallo Pieter Joost

    Ik zie nog maar weer eens dat het hoog tijd wordt om me in C# 3.0 te gaan verdiepen :-)

    Maar ik zie dat je een EventHandler gebruikt met TEventArgs – dat laatste is toch een generiek ding (dus eigenlijk TEventArgs<T>)? Maakt dat niet uit in 3.0? In Java zijn generieke typen alleen generiek at compile-time, en is er ook steeds een niet-generieke variant, maar in .Net werkt dat toch niet zo?

    Overigens blijft mijn kritiek op het events-mechanisme overigens nog gewoon staan, zie
    http://www.software-innovators.nl/2008/02/03/events-in-net/

    Geplaatst op 20 maart 2008 om 12:56 Permalink