﻿
{"id":3891,"date":"2016-04-05T01:49:55","date_gmt":"2016-04-05T01:49:55","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=3891"},"modified":"2016-04-05T01:49:56","modified_gmt":"2016-04-05T01:49:56","slug":"cta-icloneable-interfacei-ile-nesne-kopyalama","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-icloneable-interfacei-ile-nesne-kopyalama\/","title":{"rendered":"C#&#8217;ta ICloneable Interface&#8217;i \u0130le Nesne Kopyalama"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu yaz\u0131m\u0131zda C#&#8217;ta bir nesneyi kopyalamam\u0131za yarayan ICloneable Interface&#8217;ini inceleyece\u011fiz. Tabi bu Interface&#8217;e gelmeden \u00f6nce uzun uzun bir ka\u00e7 hususta konu\u015fal\u0131m diyorum&#8230;<\/p>\n<p>C#&#8217;ta(ve Java vs. gibi pop\u00fcler programlama dillerinde) bildi\u011fimiz gibi de\u011fi\u015fkenler &#8220;De\u011fer Tipli De\u011fi\u015fkenler(Value Type Variable)&#8221; ve &#8220;Referans Tipli De\u011fi\u015fkenler(References Type Variable)&#8221; olmak \u00fczere ikiye ayr\u0131lmaktad\u0131rlar. Bu de\u011fi\u015fkenler aras\u0131ndaki temel fark, de\u011fer tipli de\u011fi\u015fkenler belle\u011fin Stack b\u00f6lgesinde tutulurken, referans tipli de\u011fi\u015fkenler ise Heap b\u00f6lgesinde tutulmaktad\u0131r. <\/p>\n<p>\u015eimdi a\u015fa\u011f\u0131daki durumu inceleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            int Sayi1 = 10;\r\n            int Sayi2 = Sayi1;\r\n        }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi int tipinde iki de\u011fer tipli de\u011fi\u015fken aras\u0131nda bir \u00e7al\u0131\u015fma yapt\u0131k. &#8220;Sayi2&#8221; de\u011fi\u015fkenine, &#8216;=&#8217; (Assign) operat\u00f6r\u00fc ile &#8220;Sayi1&#8221; de\u011fi\u015fkenini atad\u0131k. Bu i\u015flem yap\u0131l\u0131rken &#8220;Sayi1&#8221; de\u011fi\u015fkeninin yeni bir kopyas\u0131 olu\u015fturulmakta ve &#8220;Sayi2&#8221; de\u011fi\u015fkenine bu de\u011fi\u015fkenin de\u011feri aktar\u0131lmaktad\u0131r. Buradan gelmek istedi\u011fim nokta ise; &#8220;Sayi2&#8221; de\u011fi\u015fkeninde yap\u0131lan herhangi bir de\u011fi\u015fiklik &#8220;Sayi1&#8221; de\u011fi\u015fkenini etkilemeyecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            int Sayi1 = 10;\r\n            int Sayi2 = Sayi1;\r\n            Console.WriteLine(&quot;Sayi2 de\u011fi\u015fkenin de\u011feri : &quot; + Sayi2);\r\n            Console.WriteLine(&quot;Sayi1 de\u011fi\u015fkenin de\u011feri : &quot; + Sayi1);\r\n            Sayi2 = 21;\r\n            Console.WriteLine(&quot;Sayi2 de\u011fi\u015fkenin de\u011feri : &quot; + Sayi2);\r\n            Console.WriteLine(&quot;Sayi1 de\u011fi\u015fkenin de\u011feri : &quot; + Sayi1);\r\n        }\r\n<\/pre>\n<p><div id=\"attachment_3893\" style=\"width: 242px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-icloneable-interfacei-ile-nesne-kopyalama\/cta-icloneable-interfacei-ile-nesne-kopyalama\/\" rel=\"attachment wp-att-3893\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3893\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-ICloneable-Interfacei-\u0130le-Nesne-Kopyalama.png\" alt=\"C#&#039;ta ICloneable Interface&#039;i \u0130le Nesne Kopyalama\" width=\"232\" height=\"105\" class=\"size-full wp-image-3893\" \/><\/a><p id=\"caption-attachment-3893\" class=\"wp-caption-text\">C#&#8217;ta ICloneable Interface&#8217;i \u0130le Nesne Kopyalama<\/p><\/div><br \/>\nYukar\u0131daki \u00f6rnek kod blo\u011funun \u00e7\u0131kt\u0131s\u0131nda da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi de\u011fer tipli de\u011fi\u015fkenlerde yukar\u0131daki sat\u0131rlarda anlatt\u0131\u011f\u0131m durum ge\u00e7erlidir.<\/p>\n<p>Amma velakin referans tipli de\u011fi\u015fkenler i\u00e7in durum hi\u00e7te b\u00f6yle de\u011fildir.<br \/>\n\u00d6rnek olarak elimizde a\u015fa\u011f\u0131daki gibi bir s\u0131n\u0131f\u0131m\u0131z olsun.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Araba\r\n    {\r\n        public int ArabaNo { get; set; }\r\n        public string Marka { get; set; }\r\n        public string Model { get; set; }\r\n        public string KM { get; set; }\r\n        public bool Vites { get; set; }\r\n    }\r\n<\/pre>\n<p>\u015eimdi a\u015fa\u011f\u0131daki durumu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Araba araba = new Araba();\r\n            Araba _araba = araba;\r\n        }\r\n<\/pre>\n<p>_araba referans\u0131na = operat\u00f6r\u00fc ile araba referans\u0131 atan\u0131rsa, bu referanslara ba\u011fl\u0131 olan nesnelerin bellek \u00fczerindeki adresleri kopyalanmaktad\u0131r. Yani a\u015fa\u011f\u0131daki \u015femada oldu\u011fu gibi iki referansta ayn\u0131 nesneyi g\u00f6stermektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-icloneable-interfacei-ile-nesne-kopyalama\/cta-icloneable-interfacei-ile-nesne-kopyalama-2\/\" rel=\"attachment wp-att-3895\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-ICloneable-Interfacei-\u0130le-Nesne-Kopyalama-1.png\" alt=\"C#&#039;ta ICloneable Interface&#039;i \u0130le Nesne Kopyalama\" width=\"516\" height=\"218\" class=\"aligncenter size-full wp-image-3895\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-ICloneable-Interfacei-\u0130le-Nesne-Kopyalama-1.png 516w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-ICloneable-Interfacei-\u0130le-Nesne-Kopyalama-1-300x127.png 300w\" sizes=\"auto, (max-width: 516px) 100vw, 516px\" \/><\/a><br \/>\nBu demek oluyor ki, _araba referans\u0131 \u00fczerinde yapt\u0131\u011f\u0131m\u0131z herhangi bir de\u011fi\u015fiklik, araba renferans\u0131n\u0131da etkileyecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Araba araba = new Araba() { ArabaNo = 1, KM = &quot;0&quot;, Marka = &quot;Opel&quot;, Model = &quot;Astra&quot;, Vites = true };\r\n\r\n            Console.WriteLine(&quot;Araba No : &quot; + araba.ArabaNo + &quot;\\nKM : &quot; + araba.KM + &quot;\\nMarka : &quot; + araba.Marka + &quot;\\nModel : &quot; + araba.Model + &quot;\\nVites : &quot; + araba.Vites);\r\n            Console.WriteLine(&quot;**************&quot;);\r\n\r\n            Araba _araba = araba;\r\n            _araba.ArabaNo = 1;\r\n            _araba.KM = &quot;10&quot;;\r\n            _araba.Marka = &quot;Opel&quot;;\r\n            _araba.Model = &quot;Corsa&quot;;\r\n            _araba.Vites = false;\r\n\r\n            Console.WriteLine(&quot;Araba No : &quot; + araba.ArabaNo + &quot;\\nKM : &quot; + araba.KM + &quot;\\nMarka : &quot; + araba.Marka + &quot;\\nModel : &quot; + araba.Model + &quot;\\nVites : &quot; + araba.Vites);\r\n\r\n            Console.WriteLine(&quot;**************&quot;);\r\n\r\n            Console.WriteLine(&quot;Araba No : &quot; + _araba.ArabaNo + &quot;\\nKM : &quot; + _araba.KM + &quot;\\nMarka : &quot; + _araba.Marka + &quot;\\nModel : &quot; + _araba.Model + &quot;\\nVites : &quot; + _araba.Vites);\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011fu, yapt\u0131\u011f\u0131m\u0131z a\u00e7\u0131klamada oldu\u011fu gibi a\u015fa\u011f\u0131daki sonucu verecektir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-icloneable-interfacei-ile-nesne-kopyalama\/cta-icloneable-interfacei-ile-nesne-kopyalama-3\/\" rel=\"attachment wp-att-3897\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-ICloneable-Interfacei-\u0130le-Nesne-Kopyalama-2.png\" alt=\"C#&#039;ta ICloneable Interface&#039;i \u0130le Nesne Kopyalama\" width=\"135\" height=\"320\" class=\"aligncenter size-full wp-image-3897\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-ICloneable-Interfacei-\u0130le-Nesne-Kopyalama-2.png 135w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-ICloneable-Interfacei-\u0130le-Nesne-Kopyalama-2-127x300.png 127w\" sizes=\"auto, (max-width: 135px) 100vw, 135px\" \/><\/a><\/p>\n<p>Referans tipli de\u011fi\u015fkenlerin birbirlerine atanmas\u0131 durumunda bellekteki adreslerin kopyalanmas\u0131na <strong><em>Shallow Copy<\/em><\/strong> denmektedir. Asl\u0131nda, referans tiplerde = operat\u00f6r\u00fc ile atama yap\u0131ld\u0131\u011f\u0131nda, arka tarafta Object s\u0131n\u0131f\u0131ndan miras al\u0131nan, MemberwiseClone isimli metod \u00e7a\u011fr\u0131lmaktad\u0131r. \u0130\u015fte bu metod referans tiplerin atanmas\u0131 i\u00e7in Shallow Copy ger\u00e7ekle\u015ftirir. Yani referanslar\u0131n de\u011ferleri de\u011fil, bellek \u00fczerindeki adresleri kopyaland\u0131\u011f\u0131ndan dolay\u0131 Shallow Copy yani S\u0131\u011f Kopyalama veyahut Y\u00fczeysel Kopyalama denmektedir. <\/p>\n<p>E\u011fer ki biz; Immutable bir nesne olu\u015fturarak, yani ilgili nesneden yeni bir kopya olu\u015fturup o kopyay\u0131 atamay\u0131 istiyorsak i\u015fte bu yaz\u0131m\u0131z\u0131n as\u0131l i\u00e7eri\u011fiyle alakal\u0131 sat\u0131rlar\u0131na gelmi\u015f bulunmaktay\u0131z. <\/p>\n<p>Haliyle ba\u015fl\u0131ktan da anla\u015f\u0131laca\u011f\u0131 gibi ICloneable Interface&#8217;i elimizdeki nesneleri kopyalamam\u0131z\u0131 sa\u011flayan bir aray\u00fcz g\u00f6revi g\u00f6rmektedir. <\/p>\n<blockquote><p>Nesnelerin kopyalanmas\u0131 i\u015flemine &#8220;Deep Copy&#8221; ad\u0131 verilir.<\/p><\/blockquote>\n<p>Tabi \u00f6ncelikle ICloneable Interface&#8217;ini kullanmadan elimizdeki nesneyi ba\u015fka nas\u0131l kopyalayabiliriz inceleyelim. \u00d6rne\u011fimizi yukar\u0131da olu\u015fturdu\u011fumuz Araba s\u0131n\u0131f\u0131 \u00fczerinde ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Araba\r\n    {\r\n        public int ArabaNo { get; set; }\r\n        public string Marka { get; set; }\r\n        public string Model { get; set; }\r\n        public string KM { get; set; }\r\n        public bool Vites { get; set; }\r\n\r\n        public Araba Copy()\r\n        {\r\n            return new Araba\r\n            {\r\n                ArabaNo = this.ArabaNo,\r\n                Marka = this.Marka,\r\n                Model = this.Model,\r\n                KM = this.KM,\r\n                Vites = this.Vites\r\n            };\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi ilgili s\u0131n\u0131f i\u00e7erisine Copy isminde bir metod tan\u0131mlayarak geriye ayn\u0131 tipte bir nesne d\u00f6nd\u00fcrebiliriz. Haliyle o anki nesne, yeni olu\u015fturaca\u011f\u0131 nesneye kendi property de\u011ferlerini aktaracak ve geriye kopyalanm\u0131\u015f gibi ayn\u0131 de\u011ferleri ta\u015f\u0131yan bir vaziyette d\u00f6necektir.<\/p>\n<p>ya da a\u015fa\u011f\u0131daki \u00f6rne\u011fi inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Araba\r\n    {\r\n        public int ArabaNo { get; set; }\r\n        public string Marka { get; set; }\r\n        public string Model { get; set; }\r\n        public string KM { get; set; }\r\n        public bool Vites { get; set; }\r\n\r\n        public Araba Copy()\r\n        {\r\n            return (Araba)this.MemberwiseClone();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yaz\u0131m\u0131z\u0131n yukar\u0131daki sat\u0131rlar\u0131nda bahsetti\u011fim MemberwiseClone metodu arac\u0131l\u0131\u011f\u0131yla da ilgili nesnemizi kopyal\u0131p geriye d\u00f6nd\u00fcrebiliriz. Dikkat edersek, o anki nesnenin MemberwiseClone metodu ile copyas\u0131n\u0131 object olarak elde ediyor, cast ederek geriye d\u00f6nd\u00fcr\u00fcyoruz.<\/p>\n<p>\u0130ki i\u015flem i\u00e7inde a\u015fa\u011f\u0131daki kullan\u0131m ayn\u0131 sonucu verecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Araba araba = new Araba();\r\n            Araba _araba = araba.Copy();\r\n            if (araba.Equals(_araba))\r\n                Console.WriteLine(&quot;Nesneler ayn\u0131&quot;);\r\n            else\r\n                Console.WriteLine(&quot;Nesneler farkl\u0131&quot;);\r\n        }\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-icloneable-interfacei-ile-nesne-kopyalama\/cta-icloneable-interfacei-ile-nesne-kopyalama-4\/\" rel=\"attachment wp-att-3903\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-ICloneable-Interfacei-\u0130le-Nesne-Kopyalama-3.png\" alt=\"C#&#039;ta ICloneable Interface&#039;i \u0130le Nesne Kopyalama\" width=\"148\" height=\"52\" class=\"aligncenter size-full wp-image-3903\" \/><\/a><\/p>\n<p>Ayn\u0131 i\u015fi ICloneable Interface&#8217;i ilede a\u015fa\u011f\u0131daki gibi ger\u00e7ekle\u015ftirebilmekteyiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Araba : ICloneable\r\n    {\r\n        public int ArabaNo { get; set; }\r\n        public string Marka { get; set; }\r\n        public string Model { get; set; }\r\n        public string KM { get; set; }\r\n        public bool Vites { get; set; }\r\n\r\n        public object Clone()\r\n        {\r\n            return this.MemberwiseClone();\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi IConeable Interface&#8217;ini uygulad\u0131\u011f\u0131m\u0131zda Clone metodunu implement ettirmektedir. Bu metod i\u00e7erisinde de MemberwiseClone metodu sayesinde nesnemizin kopyas\u0131n\u0131 object olarak g\u00f6ndermekteyiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Araba araba = new Araba();\r\n            Araba _araba = (Araba)araba.Clone();\r\n            if (araba.Equals(_araba))\r\n                Console.WriteLine(&quot;Nesneler ayn\u0131&quot;);\r\n            else\r\n                Console.WriteLine(&quot;Nesneler farkl\u0131&quot;);\r\n        }\r\n<\/pre>\n<p>Clone nesnesinden gelen nesneyi cast ederek elde etmemiz gerekecektir.<\/p>\n<p>Ve sonu\u00e7 gene ayn\u0131 olacakt\u0131r.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-icloneable-interfacei-ile-nesne-kopyalama\/cta-icloneable-interfacei-ile-nesne-kopyalama-4\/\" rel=\"attachment wp-att-3903\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-ICloneable-Interfacei-\u0130le-Nesne-Kopyalama-3.png\" alt=\"C#&#039;ta ICloneable Interface&#039;i \u0130le Nesne Kopyalama\" width=\"148\" height=\"52\" class=\"aligncenter size-full wp-image-3903\" \/><\/a><\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu yaz\u0131m\u0131zda C#&#8217;ta bir nesneyi kopyalamam\u0131za yarayan ICloneable Interface&#8217;ini inceleyece\u011fiz. Tabi bu Interface&#8217;e gelmeden \u00f6nce uzun uzun bir ka\u00e7 hususta konu\u015fal\u0131m diyorum&#8230; C#&#8217;ta(ve Java vs. gibi pop\u00fcler programlama dillerinde) bildi\u011fimiz gibi de\u011fi\u015fkenler &#8220;De\u011fer&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3014,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,338,720],"tags":[1020,1021,1024,1015,1019,1023,1017,1018,1022,1016],"class_list":["post-3891","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-5-0","category-c-6-0","tag-assign","tag-assign-operatoru","tag-deep-copy","tag-deger-tipli-degiskenler","tag-icloneable","tag-memberwiseclone","tag-referans-tipli-degiskenler","tag-references-type-variable","tag-shallow-copy","tag-value-type-variable"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3891","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=3891"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3891\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3014"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=3891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=3891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=3891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}