Optymalizacja klasy String

Wbudowany mechanizm optymalizacji może czasami przynieść zaskakujące wyniki. Rozważmy poniższy fragment kodu:

string var1 = "text";
string var2 = "text";

bool condition = object.ReferenceEquals(var1, var2);

Wydawałoby się, że var1 i var2 stanowią dwie osobne referencje. Po uruchomieniu kodu przekonamy się jednak, że zmienna condition będzie miała wartość true. Spowodowane jest to wykonaną optymalizacją, polegającą na tym, że .NET przechowuje zbiór użytych w programie napisów. Deklarując  zmienną przechowującą napis “text” pierwszy raz, .NET zapamiętuje napis w specjalnym buforze. Następnie gdy zostanie zadeklarowana ponownie ta sama wartość(“text”), nie nastąpi ponowna alokacja pamięci, a zwykłe przypisanie wskaźnika na wcześniej zapisaną wartość w buforze. Struktura adresowania wygląda więc mniej więcej tak:

image

Niestety nie zawsze może nastąpić optymalizacja. Poniższy kod nie zostanie zoptymalizowany i wartość condition będzie miała wartość false:

string var1 = "text";
string var2 = "tex";
var2 += "t";

bool condition = object.ReferenceEquals(var1, var2);

4 thoughts on “Optymalizacja klasy String”

  1. Zagadka: Czy warunek będzie spełniony?

    string var1 = “text”;
    string var2 = “tex”;
    var2 += “t”;

    if((object)var1 == (object)var2)
    {
    }

    Odpowiedź brzmi nie, bo operator == dla typów referencyjnych (a to wymusiliśmy rzutowaniem) sprawdza czy odwołują się do tego samego obiektu.

  2. @oska-at.net
    Albo odwrotnie;) Moj Wpis zostal opublikowany w lutym 2010 🙂
    Pozdrawiam
    Piotr

Leave a Reply

Your email address will not be published.