Home Blog General Eventing made easy: MyEvent.Raise(this, EventArgs.Empty);

16

Maa

2008

Eventing made easy: MyEvent.Raise(this, EventArgs.Empty); PDF Afdrukken E-mail

Zoals elke developer heb ik een hekel aan repeterende code. Als C# developer ben ik nog wel eens jaloers op somige 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 toepen 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 bepalden wat voor gedrag daar mee gemoeid gaat.

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

public static class Extensions
{
    public static void Raise<TEventArgs>(this EventHandler<TEventArgs> 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);

Conclussie

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.

Download het voorbeeld project hier: eventing.made.easy.zip
Trackback(0)
Comments (1)Add Comment
0
...
written by Frederik, maart 19, 2008
Leuk idee, maar, het stukje code dat je post zorgt er wel niet voor dat je event op een 'thread safe' manier geraised wordt.
Ik bedoel: je kan problemen krijgen met cross-thread invoking. Als je event geraised wordt op een andere thread dan waar de eventhandler uitgevoerd wordt, kan je problemen krijgen.
Dat zou je dus ook nog moeten checken en afvangen in die method.

Write comment

busy
 

Connect buttons

View pjvdsande's profile on slideshare

View Pieter Joost van de Sande's profile on LinkedIn

Xbox360 Gamertag

C# MVP

Microsoft MVP logo

Twitter

Could not write to cache/twitter.cache

@jonnekats You saw the mail?
@luus Cool, which office it that?
@builderror Darn, that spoiled my last invite. But it was worth trying.
Is there a way in .NET 4.0 to just thrust everything, like we could do before with caspol?

Quote XNA presentatie

Bedankt voor je schitterende presentatie. Ik heb niets dan positieve geluiden gehoord.

Peter Criellaard
Microsoft

Quote Coding dilemma's

Eindelijk een presentatie waarmee ik ook iets mee kan in de praktijk!

Dennis Schuuring
Max BV

Quote C# fun!

Bedankt voor de presentatie, het was voor mij 1 van de betere momenten van die dag!

Henri Koppen
Arcenus