﻿
{"id":6079,"date":"2017-04-21T15:38:12","date_gmt":"2017-04-21T15:38:12","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=6079"},"modified":"2017-04-21T15:42:27","modified_gmt":"2017-04-21T15:42:27","slug":"cta-gostericipointer-nedir-i","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-gostericipointer-nedir-i\/","title":{"rendered":"C#&#8217;ta G\u00f6sterici(Pointer) Nedir? &#8211; I"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>\u00dczerinde \u00e7al\u0131\u015f\u0131lan projede bellek veya mikroi\u015flemci d\u00fczeyinde herhangi bir i\u015flevde bulunmuyorsak e\u011fer bellek y\u00f6netimi .NET mimarisinde Garbage Collector(Gereksiz Bilgi Toplay\u0131c\u0131) dedi\u011fimiz mekanizma taraf\u0131ndan bizim yerimize otomatik olarak sa\u011flanmaktad\u0131r. E\u011fer ki yaz\u0131l\u0131msal olarak bellek y\u00f6netimini direkt olarak programc\u0131ya b\u0131rakmak istiyorsak e\u011fer G\u00f6sterici(Pointer) dedi\u011fimiz yap\u0131lar devreye girmektedir.<\/p>\n<p>C ve C++ dillerinin en g\u00fc\u00e7l\u00fc yan\u0131 olan g\u00f6stericiler C# dilinde de mevcuttur. \u0130\u015flevsel olarak verdi\u011fim iki dilde nas\u0131l bir fonksiyonelli\u011fe sahiplerse C#&#8217;ta da ayn\u0131 \u00f6zelliklerle kar\u015f\u0131m\u0131za \u00e7\u0131kmaktad\u0131rlar. <strong><em>Peki nedir o \u00f6zellikler?<\/em><\/strong><\/p>\n<p>G\u00f6stericiler; de\u011fi\u015fkenlerin ve nesnelerin bellekteki adreslerini tutan de\u011fi\u015fken tipleridir.<br \/>\n\u00d6rnek olarak a\u015fa\u011f\u0131da tan\u0131mlanan de\u011fi\u015fkeni ele alal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nint a = 3;\r\n<\/pre>\n<p>&#8220;a&#8221; de\u011fi\u015fkeni bellekte &#8220;3&#8221; de\u011ferini tutmaktad\u0131r. Biz bu &#8220;3&#8221; de\u011ferine eri\u015fmek i\u00e7in &#8220;a&#8221; de\u011fi\u015fkenin referans ad\u0131n\u0131 kullanmaktay\u0131z. Fakat mikroi\u015flemci d\u00fczeyinde de\u011fi\u015fken diye bir terimin olmamas\u0131ndan dolay\u0131 mikroi\u015flemci bellekteki herhangi bir nesneye-de\u011fi\u015fkene eri\u015fmek i\u00e7in o de\u011fi\u015fkenin bellek adresini kullan\u0131r. Heh i\u015fte bellekteki bu adreslerin programlamadaki kar\u015f\u0131l\u0131klar\u0131 g\u00f6sterici(pointer)lerdir.<\/p>\n<p>\u015eimdi d\u00fc\u015f\u00fcn\u00fcn ki, &#8220;a&#8221; de\u011fi\u015fkenini g\u00f6steren be\u015f adet pointer olsun. Bu pointerlar\u0131n hepsinin de\u011feri &#8220;3&#8221; olacakt\u0131r. E\u011fer ki pointerlar\u0131n tuttu\u011fu adresteki veri de\u011fi\u015firse bu de\u011fi\u015fiklik t\u00fcm pointerlara ve de\u011fi\u015fkene yans\u0131t\u0131lacakt\u0131r.<\/p>\n<p>Programlamada pointer kullanman\u0131n bir\u00e7ok avantaj\u0131n\u0131n yan\u0131nda bir o kadar da dezavantaj\u0131 mevcuttur. Her ne kadar bellek y\u00f6netimi elimizin alt\u0131nda olsada, bir pointer\u0131n g\u00f6sterdi\u011fi adreste pointer\u0131n tipinde ge\u00e7erli bir de\u011fer olmas\u0131n\u0131n garantisi yoktur. Art\u0131k o adreste de\u011fer olarak ne varsa pointer tipinde bir de\u011fer olarak farz edilir. Bu olas\u0131 durumlarda ne yaz\u0131k ki \u00f6yle kolay kolay g\u00f6zlemlenebilir bir yap\u0131ya sahip de\u011fildirler. Onlarca test sonucunda hi\u00e7 hata yokmu\u015f gibi \u00e7al\u0131\u015fan program\u0131m\u0131z hi\u00e7 beklenmedi\u011fi bir anda \u00e7\u00f6kme durumuyla kar\u015f\u0131 kar\u015f\u0131ya kalabilir.<\/p>\n<p>\u0130\u015fte .NET mimarisi(ve Java&#8217;da dahil) bu sorunu ortadan kald\u0131rmak i\u00e7in her durumda pointer kullan\u0131m\u0131 yerine &#8220;reference&#8221; dedi\u011fimiz nesneleri refere eden yap\u0131lar\u0131 getirmi\u015f bulunmaktad\u0131rlar. <\/p>\n<p>\u0130lerideki yaz\u0131lar\u0131m\u0131zda g\u00f6rece\u011finiz \u00fczere pointer de\u011fi\u015fkenler her ne kadar ilgili de\u011fi\u015fkenin bellekteki adresini tutsalarda C# ile bu adreslerin de\u011fersel bilgilerini elde edememekteyiz. Oyca C ve C++ ile bellek adreslerine eri\u015fim m\u00fcmk\u00fcnd\u00fcr&#8230;<\/p>\n<p>Ayriyetten unutmay\u0131n ki pointer kullanarak bellek y\u00f6netimini programc\u0131ya devrettiysek Garbage Collector mekanizmas\u0131 aktifli\u011fini yitirecektir.<\/p>\n<p>Asl\u0131nda bir ger\u00e7e\u011fi itiraf etmekte fayda vard\u0131r ki, o da \u00e7ok \u00e7ok istisnai durumlar mevzu bahis olmad\u0131k\u00e7a g\u00f6stericilere ihtiyac\u0131n\u0131z olmayaca\u011f\u0131d\u0131r. <em><strong>Peki nedir o istisnai durumlar?<\/strong><\/em><\/p>\n<ul>\n<li><strong><em>Geriye Uyumluluk(Backward Compatibility)<\/em><\/strong><br \/>\n\u0130\u015fletim sisteminin eski ve kullan\u0131m\u0131 \u00e7ok nadir olan fonksiyonelliklerine gereksinim duydu\u011fumuzda yahut COM ve Win32 API olarak tarif edilen harici kaynaklar\u0131 kullanaca\u011f\u0131m\u0131z durumlarda g\u00f6sterici(pointer) kullanan fonksiyonlarla kar\u015f\u0131la\u015fmam\u0131z y\u00fcksek olas\u0131d\u0131r. E\u011fer ki C#&#8217;ta pointer kullan\u0131m\u0131na izin verilmemi\u015f olsayd\u0131 i\u015fte o zaman bu dil dedesinin mezar ta\u015f\u0131n\u0131 okuyamaz olurdu.\n<\/li>\n<li>\n<strong><em>Performans<\/em><\/strong><br \/>\nC ve C++ programlama dillerinin pop\u00fclaritesinin alt\u0131ndaki en b\u00fcy\u00fck koz bellek y\u00f6netiminde araya p\u00fcr\u00fcz kar\u0131\u015ft\u0131rmamalar\u0131d\u0131r. Haliyle bizler i\u00e7inde performans\u0131n \u00e7ok \u00e7ok \u00f6nemli oldu\u011fu yerlerde g\u00f6sterici kullanmam\u0131zdan daha do\u011fal bir\u015fey olmasa gerek&#8230;\n<\/li>\n<li>\n<strong><em>Alt Seviye \u0130\u015flemler<\/em><\/strong><br \/>\nDonan\u0131msal programlanm\u0131\u015f projelerde g\u00f6stericiler olmazsa olmaz yap\u0131lard\u0131r.\n<\/li>\n<li>\n<strong><em>Hata Ay\u0131klay\u0131c\u0131 Programlar<\/em><\/strong><br \/>\nDebugger diye nitelendirilen hata ay\u0131klay\u0131c\u0131 programlar\u0131 yazabilmek i\u00e7in mutlaka belle\u011fe direkt eri\u015fimin olmas\u0131 gerekmektedir.\n<\/li>\n<\/ul>\n<p>Bu i\u00e7eri\u011fimizde C# programlama dili a\u00e7\u0131s\u0131ndan pointerlar\u0131n \u00f6nemini teorik olarak ele almaya \u00e7al\u0131\u015ft\u0131k. Ayr\u0131ca mant\u0131ksal olarak biraz konuyu e\u015feleyip tad\u0131nda b\u0131rakt\u0131k. Sonraki yaz\u0131m\u0131zda C# ile pointer kullanman\u0131n anahtar\u0131 olan unsafe keyword\u00fc \u00fczerine i\u00e7eri\u011fimizi detayland\u0131raca\u011f\u0131z.<\/p>\n<p>O halde g\u00f6r\u00fc\u015fmek \u00fczere diyorum&#8230;<br \/>\nHo\u015f\u00e7akal\u0131n&#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, \u00dczerinde \u00e7al\u0131\u015f\u0131lan projede bellek veya mikroi\u015flemci d\u00fczeyinde herhangi bir i\u015flevde bulunmuyorsak e\u011fer bellek y\u00f6netimi .NET mimarisinde Garbage Collector(Gereksiz Bilgi Toplay\u0131c\u0131) dedi\u011fimiz mekanizma taraf\u0131ndan bizim yerimize otomatik olarak sa\u011flanmaktad\u0131r. E\u011fer ki yaz\u0131l\u0131msal olarak bellek&#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],"tags":[1755,1753,1743,1749,1745,1747,1746,1744,1750,1752,1756,1754,1748,1751,1757],"class_list":["post-6079","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-alt-seviye-islemler","tag-backward-compatibility","tag-bellek-yonetimi","tag-bellek-yonetimi-pointer","tag-c-bellek-yonetimi","tag-c-gosterici","tag-c-pointer","tag-garbage-collector","tag-gereksiz-bilgi-toplayici","tag-geriye-uyumluluk","tag-hata-ayiklayici-programlar","tag-performans","tag-pointer","tag-reference","tag-unsafe"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/6079","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=6079"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/6079\/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=6079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=6079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=6079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}