Søg på DotNyt:
Denne blog er flyttet til www.nielsbrinch.com


mandag den 12. maj 2008

Anvendelse af Extension Methods

skrevet af Niels Brinch

En hurtig demonstration af hvordan man anvende Extension Methods som blev indført med C# 3.0.

Det går ud på at man kan føje flere funktioner til eksisterende klasser, uden f.eks. at skulle nedarve. Synes du f.eks. der mangler en metode på List<string>, jamen så tilføjer du den da bare. Det er en hel lang diskussion om hvorvidt man bør anvende dette, men den vil jeg ikke tage op her. Jeg vil udelukkende vise hvordan.

Konventionen siger, at du skal tilføje en klasse med samme navn som den klasse du extender og så sætte "Extensions" på. I dette tilfælde tilføjer jeg en klasse der hedder ListExtensions fordi jeg extender List-klassen.

image

Bemærk at klassen skal være 'static' for at kunne anvendes til dette.

Herefter tilføjer du metoden du ville ønske findes til klassen. Lad den modtage den type klasse som du extender som den første parameter med this foran. Sådan.

public static string Join(this List<string> list, string separator)

I den eksisterende List-klasse er der en Split-metode som f.eks. tager en komma-separeret streng og laver den om til en liste. Men der mangler en Join der nemt kan skabe en kommasepareret streng ud fra indholdet af et array. Det er den metode jeg savner og det er den jeg laver.

public static class ListExtensions
{
public static string Join(this List<string> list, string separator)
{
StringBuilder builder = new StringBuilder();

bool isFirst = true;

foreach (string str in list)
{
if (!isFirst)
{
builder.Append(separator);
}

builder.Append(str);

isFirst = false;
}

return builder.ToString();
}
}

I må meget gerne flame mig for ovenstående opbygning. Det ser ikke særligt elegant ud, synes jeg, men kan ikke lige komme på en mere elegant måde at kode det på.


Heldigvis er den elegang at anvende!


image


Med det samme er der intellisense som viser den nye metode, direkte på enhver instans af List<string>.


Resultatet er selvfølgelig, at vi kan få a,b,c,d,e ud af en List<string> lige så nemt som vi fik det ind.


image


Nemt og rart for den pragmatiske programmør.

5 kommentarer

5 Kommentarer:

At 12. maj 2008 kl. 22.01, Anonymous Anonym skrev...

Her kommer den ønskede flaming :-)

return string.Join(separator, list.ToArray());

 
At 13. maj 2008 kl. 07.55, Blogger Niels Brinch skrev...

Ha ha, cool nok. Ok, rimelig overkill det jeg har lavet så. Men i hvert fald har jeg demonstreret hvordan man bruger Extension Methods :p

 
At 13. maj 2008 kl. 12.57, Anonymous Anonym skrev...

Det beviser lidt at det er sjældent der er brug for at lave extension methods. Jeg synes der er langt mellem de gode eksempler på brugen udover selvfølgelig i sammenhæng med LINQ

 
At 13. maj 2008 kl. 14.45, Anonymous Anonym skrev...

Vi kan vel blive enige om at Extension Methods ikke kom med C# 3.0 - det var faktisk med .NET Framework 3.0 at Extension Methods kom ;)
Der findes andre sprog en C# som har Extension Methods som VB.NET ;)

 
At 14. maj 2008 kl. 01.27, Blogger Thomas skrev...

Extension Methods er en sprogudvidelse til C# 3.0 og VB.NET 9.0.

Se The Microsoft Visual Basic Language Specification 9.0 punkt 9.2.7 og C# Language Specification 3.0 punkt 10.6.9

Men det er heller ikke helt let at holde styr på.

------

.NET 2.0 består af CLR 2.0, C# 2.0, VB.NET 8.0 og Framework libraries 2.0.

------

.NET 3.0 består af CLR 2.0, C# 2.0, VB.NET 8.0 og Framework libraries 3.0.

------

.NET 3.5 består af CLR 2.0, C# 3.0, VB.NET 9.0 og Framework libraries 3.5.


Thomas

 

Send en kommentar

<< Tilbage


 
Til forsiden

Niels Brinch