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:
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å.
@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