{"id":1256,"date":"2020-10-31T13:38:09","date_gmt":"2020-10-31T12:38:09","guid":{"rendered":"http:\/\/piatkosia.k4be.pl\/wordpress\/?p=1256"},"modified":"2020-10-31T13:38:22","modified_gmt":"2020-10-31T12:38:22","slug":"1256","status":"publish","type":"post","link":"https:\/\/piatkosia.k4be.pl\/wordpress\/2020\/10\/31\/1256\/","title":{"rendered":"Modyfikacja stringa w c#"},"content":{"rendered":"<p style=\"text-align: justify;\">Tak, lubi\u0119, jak okazuje si\u0119, \u017ce mo\u017cna zrobi\u0107 co\u015b, czego uczymy si\u0119 \u017ce nie mo\u017cna tego zrobi\u0107.<br \/>Na przyk\u0142ad tego, \u017ce &#8222;strings are immutable&#8221;, albo jak kto woli, \u017ce \u0142a\u0144cuchy znakowe s\u0105 niezmienne. To znaczy jak mamy zmian\u0119, to tak naprawd\u0119 tworzy si\u0119 dla nas pod spodem nowy string. Czy to prawda? No je\u017celi zamkniemy si\u0119 do bezpiecznego kodu zarz\u0105dzalnego to jest prawda, jednak\u017ce og\u00f3lnie da si\u0119 zmodyfikowa\u0107 stringa, pod warunkiem \u017ce odta\u0144czymy taniec szamana (u\u017cyjemy wska\u017anik\u00f3w), przeskoczymy nad ogniem (czyli nasz kod b\u0119dzie w sekcji unsafe) i zagrozimy \u015bmieciarzowi by trzyma\u0142 si\u0119 od naszej zmiennej z daleka (wi\u0119c zablokujemy &#8222;wska\u017anik&#8221; na stercie).<br \/>Wi\u0119c zr\u00f3bmy tak, by w naszym stringu posz\u0142o oczko.<\/p>\n\n\n<!--more-->\n\n\n\n<pre class=\"wp-block-code\"><code>using System;\r\nnamespace Oczko\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string&#91;] args)\r\n        {\r\n            int przesuni\u0119cie = 4;\r\n            string naszString = \"=================================================\";\r\n            Console.WriteLine($\"Tak wygl\u0105da nowy string:\\n {naszString}\");\r\n            unsafe\r\n            {\r\n                fixed (char* wska\u017anik = naszString)\r\n                {\r\n                    char* p = wska\u017anik + przesuni\u0119cie;\r\n                    foreach (char znak in \"oczko\")\r\n                    {\r\n                        *++p = znak;\r\n                    }\r\n                }\r\n            }\r\n            Console.WriteLine($\"Tak wygl\u0105da zu\u017cyty string:\\n {naszString}\");\r\n            Console.ReadKey();\r\n        }\r\n    }\r\n}<\/code><\/pre>\n\n\n\n\n<p style=\"text-align: justify;\"><br \/>Nie zapomnijcie ustawi\u0107 w preferences-&gt; build -&gt; [debug\/release] -&gt; Allow unsafe code lub skompilowa\u0107 plik z prze\u0142\u0105cznikiem \/unsafe!<\/p>\n<p style=\"text-align: justify;\">Co tu si\u0119 sta\u0142o?<br \/>Oczywi\u015bcie w kodzie niezarz\u0105dzalnym jak dobrze wiemy, string jest tablic\u0105 znak\u00f3w. No +vat, ale my nie o tym:p No wi\u0119c sobie wykorzystajmy ten fakt. Wykorzystajmy r\u00f3wnie\u017c fakt, \u017ce wska\u017anik to tak naprawd\u0119 liczba, wi\u0119c mo\u017cna iterowa\u0107 po znakach dodaj\u0105c sobie cyferki i wtedy przesuwamy si\u0119 na kolejne pola. S\u0142\u00f3wko fixed nam zakotwiczy\u0142o wska\u017anik na stercie (\u017ceby GC go nie przeni\u00f3s\u0142), potem zadeklarowali\u015bmy wska\u017anik o tym samym adresie, przesun\u0119li\u015bmy kawa\u0142ek i pu\u015bcili\u015bmy w nim oczko. No i wy\u015bwietlilismy tego stringa jeszcze raz, zatrzymuj\u0105c konsol\u0119. Blok unsafe s\u0142u\u017cy do tego by kompilator si\u0119 nie wystraszy\u0142 wska\u017anika (pozwala nam na bezpo\u015bredni dost\u0119p do pami\u0119ci &#8211; ale z wszystkimi konsekwencjami &#8211; np nie posprz\u0105ta po nas). I tak oto zmodyfikowali\u015bmy rzekomo niemodyfikowalny string puszczaj\u0105c w nim oczko.<\/p>\n<p style=\"text-align: justify;\">Z tym \u017ce uwaga! Istnieje co\u015b takiego jak string interning i polega mniej wi\u0119cej na tym, \u017ce jak \u015brodowisko uruchomieniowe zobaczy kilka string\u00f3w (kt\u00f3re przecie\u017c s\u0105 niemutowalne:p) o takiej samej warto\u015bci, to pomimo \u017ce nie maj\u0105 one ze sob\u0105 nic wsp\u00f3lnego, b\u0119d\u0105 zapisane w jednym miejscu w pami\u0119ci (czyli b\u0119dzie kilka referencji do de facto tego samego ci\u0105gu znak\u00f3w) &#8211; wi\u0119c wtedy pytanie jak platforma zareaguje. Czy stworzy kopi\u0119 dla pozosta\u0142ych wyst\u0105pie\u0144 i zostawi zmodyfikowane tylko dla tego jednego, czy oleje bo to przecie\u017c unsafe i programista wszystko robi na w\u0142asn\u0105 odpowiedzialno\u015b\u0107?<\/p>\n<p style=\"text-align: justify;\">O samym &#8222;internowaniu&#8221; napis\u00f3w dowiedzia\u0142am si\u0119 o tym w dziwnych okoliczno\u015bciach, a mianowicie czyta\u0142am sobie w ksi\u0105\u017cce na temat synchronizacji w\u0105tk\u00f3w \u017ce nie powinno si\u0119 zak\u0142ada\u0107 locka na stringach aby unikn\u0105\u0107 w\u0142a\u015bnie blokowania za du\u017co. Swoj\u0105 drog\u0105 locka na this te\u017c nie zalecaj\u0105.<\/p>\n<p style=\"text-align: justify;\">Hmm, starczy na dzisiaj. Do zobaczenia kiedy\u015b tam.<\/p>","protected":false},"excerpt":{"rendered":"<p>Tak, lubi\u0119, jak okazuje si\u0119, \u017ce mo\u017cna zrobi\u0107 co\u015b, czego uczymy si\u0119 \u017ce nie mo\u017cna tego zrobi\u0107.Na przyk\u0142ad tego, \u017ce &#8222;strings are immutable&#8221;, albo jak<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/piatkosia.k4be.pl\/wordpress\/2020\/10\/31\/1256\/\">Lecim dalej<span class=\"screen-reader-text\">Modyfikacja stringa w c#<\/span> <i class=\"fas fa-angle-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[83,696,49],"tags":[262,817,210,815,816],"class_list":["post-1256","post","type-post","status-publish","format-standard","hentry","category-c_sharp","category-c_sharp-2","category-programowanie","tag-c_sharp","tag-fixed","tag-programowanie","tag-stringi","tag-unsafe","entry"],"_links":{"self":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/1256","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/comments?post=1256"}],"version-history":[{"count":2,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/1256\/revisions"}],"predecessor-version":[{"id":1258,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/1256\/revisions\/1258"}],"wp:attachment":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/media?parent=1256"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/categories?post=1256"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/tags?post=1256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}