Julekalender 2004 om Whidbey


4. dec 2004 14:10

I .NET 2.0 er der kommet nye features til C# hvad angår delegates.

Hvor man hidtil har skullet skrive noget i retningen af

btnGo.Click += new System.EventHandler(btnGo_Click); 

for at koble en delegate på en knaps Click-event, kan man i Whidbey (udover at bruge den gammelkendte syntaks som ovenfor) gribe dette an på flere måder.

Den første måde baserer sig på anonyme metoder, som er en ny feature i Whidbey. Man kan lave sin delegate med eller uden parametre:

btnGo.Click += delegate(object sender, System.EventArgs e)
{ 
  // Anonym metode med parametre.
  System.Windows.Forms.MessageBox.Show("Halløj fra den anonyme metode!\r\n" + "\r\nSender: " + sender.ToString());
}; 

eller

btnGo.Click += delegate
{
  // Anonym metode uden parametre.
  System.Windows.Forms.MessageBox.Show("Halløj fra den anonyme metode uden parametre!");
}; 

Forskellen på de to er ikke overraskende, at man i den første kan benytte parametrene i sin anonyme metode, og det kan man ikke i den anden.

Den anden måde benytter sig af delegate inferens. Det betyder, at der automatisk kan laves en delegate, hvis man forsøger at addere en metode med den rette signatur til en given event. Delegate inferens findes allerede i VB, hvor det har følgende syntaks:

  AddHandler EtObject.EnEvent, AddressOf MetodeDerHåndtererEvent
  RemoveHandler EtObject.EnEvent, AddressOf MetodeDerHåndtererEvent

I C# 2.0 ser syntaksen således ud:

btnGo.Click += btnGo_ClickInference; 

hvor btnGo_ClickInference har følgende udseende

private void btnGo_ClickInference(object sender, System.EventArgs e)
{
  System.Windows.Forms.MessageBox.Show("Halløj med delegate inferens!");
} 

Der er altså i .NET 2.0 en vis syntaktisk fleksibilitet i forhold til delegates i C#. Man kan så senere diskutere om brugen af delegate inferens eller anonyme metoder giver bedre eller dårligere kode. Og hvor meget eller lidt kode man bør placere i en anonym metode. Men den diskussion må vente til en senere lejlighed.



Abonnér på mit RSS feed.   Læs også de øvrige indlæg i denne Blog.