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


mandag den 9. juni 2008

Mutable string med Extension Methods!?

skrevet af Niels Brinch

Når man skal arbejde med strenge, er der en basal regel som siger, at hvis man skal lægge flere strenge sammen, skal man anvende en StringBuilder. Grunden er, at hvis man lægger to strenge sammen, "streng1"+"streng2", laver den faktisk en splinterny streng. Man kan med andre ord ikke lave om på en streng - den er immutable.

Men så fik jeg lige en tanke. Kunne man lave en Extension Method på string som samtidig bruger operator overload til at sørge for at alle streng-konkateneringer anvender en anden metode til at lægge sig sammen på, så sammenlægning af strenge pludselig, med ét slag ikke er dyre længere?

Nogle tanker?

2 kommentarer

2 Kommentarer:

At 9. juni 2008 kl. 19.15, Blogger Christian H. Nielsen skrev...

Ja, umiddelbart er det du beskriver en kraftig forenkling af den regel. Det reglen går på er at hvis man skal lave mere end 2 konkatineringer skal man bruge en stringbuilder.

Det vil sige at "1" + "2" + "3" + "4" kun er 1 konkatinering - og er derved stadig hurtigere at lave uden stringbuilder.

Det er først hvis du skal gøre det af flere omgange du kan spare noget f.eks
string s = "";
s += "1";
s += "2";
s += "3";

Årsagen er at stringbuilder arbejder på et char array, men selve stringbuilderen har selv er overhead - så man skal kun bruge den i scenarier hvor det er det overhead værd.

Ellers tror jeg også .NET frameworket ville bruge den metode som standard.

En anden god ting at se på et iøvrigt om man ca kan gætte strengens samlede længde ved instantiering af stringbuilderen, da den derved slipper for at resize det array den arbejder på.

 
At 10. juni 2008 kl. 12.47, Anonymous Anonym skrev...

@Christian: StringBuilder er faktisk bygget på String, hvilket du kan verificere via Reflector.

Strings er rigtig nok immutable, men faktisk har klassen metoder til intern manipulation. Disse er dog internal og derfor ikke umiddelbar tilgængelig for os. Man kan selvfølgelig tilgå dem via Reflection, men det er næppe relevant i praksis.

Internt benytter String (og dermed og StringBuilder) en unmanaged repræsentation.

 

Send en kommentar

<< Tilbage


 
Til forsiden

Niels Brinch