{"id":1953,"date":"2015-02-10T17:45:23","date_gmt":"2015-02-10T15:45:23","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=1953"},"modified":"2015-02-10T17:45:23","modified_gmt":"2015-02-10T15:45:23","slug":"net-fejtoro-3-megoldas","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2015\/02\/10\/net-fejtoro-3-megoldas\/","title":{"rendered":".NET fejt\u00f6r\u0151 3. &#8211; megold\u00e1s"},"content":{"rendered":"<p><a href=\"http:\/\/soci.hu\/blog\/index.php\/2015\/01\/22\/net-fejtoro-3\/\">\u00cdme a ki\u00edr\u00e1s<\/a>.<\/p>\n<p>\u00c1lljon itt \u00fajra a k\u00f3d is:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nstruct Counter\r\n{\r\n    int counter;\r\n    public override string ToString()\r\n    {\r\n        return counter++.ToString(CultureInfo.InvariantCulture);\r\n    }\r\n}\r\n\r\n&#x5B;TestMethod]\r\npublic void Teaser3()\r\n{\r\n    var sb = new StringBuilder();\r\n            \r\n    var sz = new Counter();\r\n            \r\n    sb.Append(sz);\r\n    Object p = sz;\r\n    Object o = p;\r\n    sb.Append(sz);\r\n    sb.Append(o);\r\n    sb.Append(p);\r\n    sb.Append(o);\r\n\r\n    Assert.AreEqual(&quot;01234&quot;, sb.ToString());\r\n}\r\n<\/pre>\n<p>El\u0151sz\u00f6r lemaradt a feladatb\u00f3l a Counter strukt\u00fara, an\u00e9lk\u00fcl nem volt sok \u00e9rtelme a feladatnak, ez\u00e9rt az els\u0151 p\u00e1r v\u00e1laszt nyilv\u00e1n f\u00e9lre mehetett.<br \/>\nA feladatban az a tr\u00fckk, hogy nem class, hanem strukt\u00fara a Counter t\u00edpus. A StringBuilderben a v\u00e9g\u00e9n 00012 lesz. Mi\u00e9rt?<\/p>\n<p>Az sz egy a veremben t\u00e1rolt strukt\u00fara. Az sb.Append() (ebben az esetben) objektumot v\u00e1r param\u00e9ter\u00fcl (ami reference type), amin megh\u00edvja a ToString() met\u00f3dust, \u00e9s ennek kimenet\u00e9t rakja bele az \u00e9p\u00edtend\u0151 stringbe. Azonban az sz egy strukt\u00fara, value type, \u00edgy azt a CLR-nek fel kell m\u00e1solnia a heapre. Ezt h\u00edvj\u00e1k boxingnak. Ezen pont ut\u00e1n a ToString() m\u00e1r a m\u00e1solaton h\u00edv\u00f3dik meg, az eredeti sz counter mezeje \u00e9rintetlen marad.<br \/>\nMivel postfix ++ oper\u00e1tort haszn\u00e1lunk, a kifejez\u00e9s kimenete a n\u00f6vel\u00e9s el\u0151tti \u00e9rt\u00e9k lesz, azaz 0. Ez az els\u0151 sz\u00e1munk.<br \/>\nAz Object p = sz explicit felboxolja sz-t a heapre. Az Object o = p puszt\u00e1n egy m\u00e1sik referencia lesz ugyanerre az \u00e9rt\u00e9kre.<br \/>\nEzek ut\u00e1n sb.Append(sz) \u00fajra boxol \u00e9s ki\u00edrja a 0-t, mint a kor\u00e1bbi esetben. Ez a 2. sz\u00e1munk. Sokan szerintem itt m\u00e1r 1-et v\u00e1rtak, ami \u00edgy is lenne, ha a Counter classk\u00e9nt lenne defini\u00e1lva.<br \/>\nAz sb.Append(o) az eddig m\u00e9g \u00e9rintetlen felboxolt p\u00e9ld\u00e1nyon h\u00edv\u00f3dik meg. Mivel megint csak postfix ++ van, ez is 0 lesz. Ez a 3. 0.<br \/>\nAz sb.Append(p) ugyanezen p\u00e9ld\u00e1nyra mutat, \u00edgy v\u00e9gre \u0151 m\u00e1r megn\u00f6velheti a sz\u00e1ml\u00e1l\u00f3t 2-re, \u00e9s visszaadhatja az 1-et. Ez a 4. sz\u00e1munk, ami v\u00e9gre 1.<br \/>\nAz sb.Append(o) pedig \u00fajra v\u00e9gigj\u00e1tssza a n\u00f6vel\u00e9st a m\u00e1s ismer\u0151s p\u00e9ld\u00e1nnyal, \u00edgy j\u00f6n ki bel\u0151le 2.<\/p>\n<p>Ha a t\u00edpusunk class lett volna, akkor j\u00f6tt volna ki bel\u0151le 01234.<\/p>\n<p>A p\u00e9ld\u00e1nak l\u00e1tsz\u00f3lag nincs jelent\u0151s\u00e9ge, a generikus t\u00edpusok \u00f3ta val\u00f3ban kevesebb baj van a strukt\u00far\u00e1kkal. De m\u00e9g .NET 1.0-ban l\u00e1ttam olyat, amikor HashTable[&#8220;valami&#8221;]++ ut\u00e1n a x = HashTable[&#8220;valami&#8221;] v\u00e1ltozatlan \u00e9rt\u00e9ket adott vissza, meglepve a koll\u00e9g\u00e1kat. Most m\u00e1r tal\u00e1n \u00e9rthet\u0151, mi\u00e9rt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00cdme a ki\u00edr\u00e1s. \u00c1lljon itt \u00fajra a k\u00f3d is: struct Counter { int counter; public override string ToString() { return counter++.ToString(CultureInfo.InvariantCulture); }&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,4,93],"tags":[],"class_list":["post-1953","post","type-post","status-publish","format-standard","hentry","category-net","category-szakmai-elet","category-teaser"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=1953"}],"version-history":[{"count":2,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1953\/revisions"}],"predecessor-version":[{"id":1955,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1953\/revisions\/1955"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=1953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=1953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=1953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}