2010. június 9., szerda

Mit ír ki?

Kód, szöveg nélkül:

var sb = new StringBuilder("true");
object o1 = sb.ToString();
object o2 = "true";
Console.WriteLine(o1 == "true");
Console.WriteLine(o2 == "true");

7 megjegyzés:

  1. Jaskó LászlóJun 9, 2010 11:01 AM
    Első sor False, második sor True. Amúgy nem mágia, ha debuggolod a projectet, láthatod, hogy az első o1 egy "true" értékű, szöveg tartalmú stringet tartalmaz, a második pedig egy "true" szövegtartalomra mutató referenciát, tehát valóban eltérő értékkel térhetnek vissza (és térnek is)!
    VálaszTörlés
  2. jah... a helyzet az hogy sokan elfelejtik, hogy a string az referencia tipus, és nem érték...
    még akkor is ha "működik rá" a ==
    VálaszTörlés
  3. Szerintem itt a titok inkább a string pooling. A StringBuilder mindig új objektumot hoz létre, a fordító viszont tudja, hogy az egyik helyen lévő "true" az ugyanaz, mint a másik helyen lévő, ezért ugyanarra az objektumra kapják meg a referenciát. (Ez megtehető, mivel a string immutable.)
    Az == operátor itt az object operátorát jelenti, ami egyszerűen referencia szerint összehasonlít.
    Ha == helyett Equals lenne, mindkettő true lenne, mivel a string felülbírálja azt.
    VálaszTörlés
  4. "Első sor False, második sor True. Amúgy nem mágia, ha debuggolod a projectet, láthatod, hogy az első o1 egy "true" értékű, szöveg tartalmú stringet tartalmaz, a második pedig egy "true" szövegtartalomra mutató referenciát, tehát valóban eltérő értékkel térhetnek vissza (és térnek is)!"

    Hol látszik debug módban?, a watch ezt mondja nekem:
    o1 "true" object {string}
    o2 "true" object {string}


    "jah... a helyzet az hogy sokan elfelejtik, hogy a string az referencia tipus, és nem érték...
    még akkor is ha "működik rá" a == "

    Szerintem itt nem ez történik, mert ha string-é castolod, akkor már true lesz..

    (string)o1 == "true" true bool
    VálaszTörlés
  5. most komolyan srácok, stringbuildert és console.write*-t valaki használt éles projektben életében valaha?:)
    VálaszTörlés
  6. StringBuilder-t? igen. miért ne használnánk?
    VálaszTörlés