var sb = new StringBuilder("true"); object o1 = sb.ToString(); object o2 = "true"; Console.WriteLine(o1 == "true"); Console.WriteLine(o2 == "true");
2010. június 9., szerda
Mit ír ki?
Kód, szöveg nélkül:
Feliratkozás:
Megjegyzések küldése (Atom)

7 megjegyzés:
Fordítási hibát? :D
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)!
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 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.
"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
most komolyan srácok, stringbuildert és console.write*-t valaki használt éles projektben életében valaha?:)
StringBuilder-t? igen. miért ne használnánk?
Megjegyzés küldése