Event.Raise(this, EventArgs.Empty);

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.