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:

Mr. Chapell írta...

Fordítási hibát? :D

Jaskó László írta...

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)!

Névtelen írta...

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 ==

firestrm írta...

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.

Névtelen írta...

"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

Névtelen írta...

most komolyan srácok, stringbuildert és console.write*-t valaki használt éles projektben életében valaha?:)

Névtelen írta...

StringBuilder-t? igen. miért ne használnánk?

Megjegyzés küldése