poniedziałek, 17 października 2011

Ciekawostki cz. 1

Dzisiaj będę się chwalił się swoją niewiedzą. Kilka dni temu kolega zadał mi pytanie, którym skutecznie mnie zagiął. Ponieważ uważam, że głupotą nie jest brak wiedzy co raczej udawanie, że się ją posiada, czym prędzej się Wam tym pytaniem chwalę. 

Co zostanie wyświetlone po takim kodzie i dlaczego? 

string string1 = "Test";

string string2 = string1;
string string3 = "Test";

Console.WriteLine(Equals(string1, string2)); // 1.
Console.WriteLine(Equals(string1, string3)); // 2.
Console.WriteLine(ReferenceEquals(string1, string2)); //3.
Console.WriteLine(ReferenceEquals(string1, string3)); //4.

Odpowiedź 
(Pokaż)

5 komentarzy:

  1. W odpowiedzi jest drobny błąd :) ponieważ String jest typem referencyjnym tylko jednocześnie jest immutable i ma przeładowane metody dzięki którym zachowuje się jak typ prosty. Przykład:

    string s1 = "Jeden";
    string s2 = "Dwa";
    s1 = s2;
    //Poniżej dzieje się magia
    s2= "Nowa wartość"

    Oznacza to tyle, że przypisując wartość już do utworzonego stringa, tworzymy nowy obiekt i zwracamy do niego referencję. Zagadnieniem związanym z tym jest "interning", za który odpowiedzialny jest CLR. Przechowuje on hash tablicę, która zawiera wpis dla każdego literału i jego adresu w pamięci. W momencie przypisywania literału do typu string CLR sprawdza, czy taki literał już istnieje. W przeciwnym wypadku tworzy nowy wpis w tablicy. Jeżeli literały są takie same wtedy faktycznie wskazują na jeden obiekt. To tłumaczy działanie ReferenceEquals.

    string3 + "a" tworzy nowy wpis w tablicy, metoda Replace też. Pod dodaniu String.Empty w tablicy dalej można znaleźć wpis :)

    Odpowiedź trochę zagmatwana: "Pierwsze i drugie..." "Drugi i trzeci..." Gdzie jest czwarty? :P

    OdpowiedzUsuń
  2. True, true.
    Miałem dorzucić linka z erratą: http://msdn.microsoft.com/en-us/library/system.string.intern%28v=VS.71%29.aspx
    Tutaj jest wytłumaczony intern.
    Co do czwartego to jest to niedopatrzenie, oczywiście również zwróci false.
    Podsumowując - dzięki za komentarz :)

    OdpowiedzUsuń
  3. Czwarty zwróci true. Wszystkie zwrócą true :)
    No problem.

    OdpowiedzUsuń
  4. Hehe, dobra chyba będę musiał pisać niedługo nawet erraty do komentarzy, muszę się lepiej przyglądać temu co piszę przed wysłaniem. Oczywiście, że true.
    Dobrze, że są ludzie, którzy czuwają ;)

    OdpowiedzUsuń
  5. Hehe, no stress :)
    Czekam na kolejną ciekawostkę :]

    OdpowiedzUsuń