saxus (statz) | #9, Agyfasz (419) |
2328 | #2a5e | ^ | Idézet | Wed, 29 Jan 2014 20:39:42 +01 |
84.3.*.* | *.catv.pool.telekom.hu |
"Huh, de elbaszott egy valami ez a cisztadotnet." FYI., nem csak a C#-ban immutable a string. "Neked nem kell. Van akinek szüksége lenne a karakterszintű manipulációra és ezt a nyelvek már az ősidők óta lehetővé teszik." Most is van lehetőség, csinálj belőle karaktertömböt. Ez egy tudatos tervezői döntés volt, gondolom fontosabbnak ítélték meg az előnyeit (ami pl. multithread környezetben és a stringfüggvények egyszerűségében jelentkezik, pl. ha egy string referencián osztozik egy kód több helyen és két helyen próbálná meg módosítani, ami pl. Pascal-ban simán lehetsége), mint azt, hogy néhány ember nem tud időnként karaktert kicserélni, hanem előbb chartömbbé kell alakítania: var ch = "asdf".ToCharArray(); ch[3] = 'x'; var str = new string(ch); Egyébként az összes modern nyelv ebbe az irányba indult el.
String az referencia típus, nem érték típus. A második sorban lecserélted a pointert a "nem kecske" stringre, a "kecske" string meg a GC-é lesz, ha nincs rá másik referencia. (Bár mivel fordítási időben bekerült, benn lesz az "internálótáborban").
Az s-ben egy "akarmi vgy sem" string lesz, ami egy új string példány. De ez akármi másban is így lenne. (Legalábbis nem nagyon tudok olyan nyelvről, ahol a string érték típus, meg nem is lenne túl logikus.) -- Egyébként most ennek kapcsán elkezdett érdekelni az, hogy anno Pascalban ezt hogyan oldották meg, mert ugyan a Pointer típusokra és az objektumokra figyelni kellett, hogy felszabadítsuk, néhány dologra, köztül a stringekre nem és sosem néztem utána. Nos, a válasz egyszerű, van egy egyszerű refcounteres GC rajta:
http://www.freepascal.org/docs-html/ref/refsu12.html# |