{"id":33451,"date":"2025-11-03T02:02:56","date_gmt":"2025-11-02T23:02:56","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/"},"modified":"2025-11-03T02:02:56","modified_gmt":"2025-11-02T23:02:56","slug":"her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/","title":{"rendered":"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler"},"content":{"rendered":"<p><body><\/p>\n<style>\n    \/* Mobil uyumluluk i\u00e7in stil \u00f6rnekleri *\/\n    .expert-tip {\n        background-color: #f0f8ff;\n        border-left: 5px solid #007bff;\n        padding: 15px;\n        margin: 20px 0;\n        border-radius: 4px;\n        font-style: italic;\n    }\n    .expert-tip strong {\n        color: #0056b3;\n    }\n    pre {\n        background-color: #282c34; \/* Dark background for code *\/\n        color: #abb2bf; \/* Light text for code *\/\n        padding: 15px;\n        border-radius: 8px;\n        overflow-x: auto; \/* Enable horizontal scrolling for long lines *\/\n        font-family: 'Fira Code', 'Cascadia Code', 'Consolas', monospace;\n        line-height: 1.4;\n        font-size: 0.9em;\n    }\n    code {\n        font-family: 'Fira Code', 'Cascadia Code', 'Consolas', monospace;\n        background-color: #e0e0e0; \/* Light background for inline code *\/\n        padding: 2px 4px;\n        border-radius: 3px;\n    }\n    \/* Media Query \u00d6rne\u011fi: K\u00fc\u00e7\u00fck ekranlarda kod bloklar\u0131 i\u00e7in daha az dolgu *\/\n    @media (max-width: 768px) {\n        pre {\n            padding: 10px;\n            font-size: 0.85em;\n        }\n    }\n    \/* Table styling for readability *\/\n    table {\n        width: 100%;\n        border-collapse: collapse;\n        margin: 20px 0;\n    }\n    table, th, td {\n        border: 1px solid #ddd;\n    }\n    th, td {\n        padding: 10px;\n        text-align: left;\n    }\n    th {\n        background-color: #f2f2f2;\n    }\n<\/style>\n<p>C# geli\u015ftiricisi olarak kodunuzu daha esnek, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek mi istiyorsunuz? Aray\u00fczler, polimorfizm ve gev\u015fek ba\u011f\u0131ml\u0131l\u0131k (loose coupling) sayesinde yaz\u0131l\u0131m mimarinizi g\u00fc\u00e7lendirmenin anahtar\u0131d\u0131r.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z en b\u00fcy\u00fck zorluklardan biri, de\u011fi\u015fen gereksinimlere h\u0131zla adapte olabilen ve kolayca geni\u015fletilebilen sistemler in\u015fa etmektir. \u0130\u015fte tam bu noktada C# aray\u00fczleri, yani <code>interface<\/code> anahtar kelimesiyle tan\u0131mlad\u0131\u011f\u0131m\u0131z yap\u0131lar, adeta bir kurtar\u0131c\u0131 gibi devreye girer. Peki, aray\u00fczler asl\u0131nda nedir ve neden bir C# geli\u015ftiricisi olarak bu temel yap\u0131lar\u0131 derinlemesine anlamal\u0131y\u0131z? Bu b\u00f6l\u00fcmde, aray\u00fczlerin arkas\u0131ndaki temel felsefeyi, sundu\u011fu avantajlar\u0131 ve C# ekosistemindeki yerini ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.<\/p>\n<p>Aray\u00fczler, bir s\u0131n\u0131f\u0131n veya yap\u0131n\u0131n (struct) hangi \u00fcyeleri (metotlar, \u00f6zellikler, olaylar ve indeksleyiciler) uygulayaca\u011f\u0131n\u0131 belirten bir s\u00f6zle\u015fme gibidir. Ancak bu s\u00f6zle\u015fme, uygulaman\u0131n detaylar\u0131n\u0131 de\u011fil, sadece &#8220;ne yapaca\u011f\u0131n\u0131&#8221; tan\u0131mlar. Ba\u015fka bir deyi\u015fle, bir aray\u00fcz, bir s\u0131n\u0131f\u0131n davran\u0131\u015f\u0131n\u0131 tan\u0131mlayan bir blueprint veya \u015fablon sunar, ancak bu davran\u0131\u015f\u0131n &#8220;nas\u0131l&#8221; uygulanaca\u011f\u0131na dair hi\u00e7bir detay i\u00e7ermez. Bir s\u0131n\u0131f bir aray\u00fcz\u00fc uygulad\u0131\u011f\u0131nda, aray\u00fczde tan\u0131mlanan t\u00fcm \u00fcyeleri kendi i\u00e7inde ger\u00e7ekle\u015ftirmek zorundad\u0131r. Bu zorunluluk, kodumuzun belirli bir standarda uymas\u0131n\u0131 sa\u011flayarak \u00f6ng\u00f6r\u00fclebilirli\u011fi art\u0131r\u0131r.<\/p>\n<p>Aray\u00fczlerin en b\u00fcy\u00fck avantajlar\u0131ndan biri, \u015f\u00fcphesiz polimorfizmi (\u00e7ok bi\u00e7imlilik) m\u00fcmk\u00fcn k\u0131lmas\u0131d\u0131r. Polimorfizm sayesinde, farkl\u0131 s\u0131n\u0131flar\u0131n ayn\u0131 aray\u00fcz\u00fc uygulamas\u0131 durumunda, bu s\u0131n\u0131flar\u0131n nesnelerini ayn\u0131 aray\u00fcz tipi \u00fczerinden ele alabiliriz. \u00d6rne\u011fin, <code>IKonu\u015fabilir<\/code> ad\u0131nda bir aray\u00fcz tan\u0131mlad\u0131\u011f\u0131m\u0131zda, hem <code>Kedi<\/code> s\u0131n\u0131f\u0131 hem de <code>K\u00f6pek<\/code> s\u0131n\u0131f\u0131 bu aray\u00fcz\u00fc uygulayabilir. Daha sonra, <code>IKonu\u015fabilir<\/code> tipinde bir de\u011fi\u015fken tan\u0131mlayarak, bu de\u011fi\u015fkene hem bir kedi hem de bir k\u00f6pek nesnesi atayabilir ve her ikisi i\u00e7in de <code>Konu\u015f()<\/code> metodunu \u00e7a\u011f\u0131rabiliriz. Metodun i\u00e7eri\u011fi kedi i\u00e7in &#8220;miyav&#8221;, k\u00f6pek i\u00e7in &#8220;hav hav&#8221; olsa bile, \u00e7a\u011f\u0131rma \u015feklimiz de\u011fi\u015fmez. Bu durum, kodumuzun daha genel ve esnek olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Di\u011fer bir kritik fayda ise gev\u015fek ba\u011f\u0131ml\u0131l\u0131k (loose coupling) sa\u011flamas\u0131d\u0131r. Yaz\u0131l\u0131m sistemlerinde mod\u00fcllerin veya s\u0131n\u0131flar\u0131n birbirine s\u0131k\u0131ca ba\u011fl\u0131 olmas\u0131 (tight coupling), kodun test edilebilirli\u011fini, s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve geni\u015fletilebilirli\u011fini ciddi \u015fekilde olumsuz etkiler. Aray\u00fczler, bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 azaltmam\u0131za yard\u0131mc\u0131 olur. Bir s\u0131n\u0131f, do\u011frudan ba\u015fka bir somut s\u0131n\u0131fa ba\u011f\u0131ml\u0131 olmak yerine, o s\u0131n\u0131f\u0131n uygulad\u0131\u011f\u0131 bir aray\u00fcze ba\u011f\u0131ml\u0131 olabilir. Bu sayede, somut uygulaman\u0131n de\u011fi\u015fmesi durumunda, aray\u00fcze ba\u011f\u0131ml\u0131 olan s\u0131n\u0131f\u0131n kodu etkilenmez. \u00d6rne\u011fin, bir veritaban\u0131 ba\u011flant\u0131s\u0131 i\u00e7in <code>IVeritaban\u0131Servisi<\/code> aray\u00fcz\u00fc tan\u0131mlad\u0131\u011f\u0131m\u0131zda, hem <code>SqlServerServisi<\/code> hem de <code>MySqlServisi<\/code> bu aray\u00fcz\u00fc uygulayabilir. Uygulama kodumuz <code>IVeritaban\u0131Servisi<\/code> \u00fczerinden \u00e7al\u0131\u015ft\u0131\u011f\u0131 s\u00fcrece, altta yatan veritaban\u0131 teknolojisini de\u011fi\u015ftirmemiz olduk\u00e7a kolay olacakt\u0131r.<\/p>\n<p>Aray\u00fczler, test yaz\u0131m\u0131n\u0131 da \u00f6nemli \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. Birim testleri yazarken, bir s\u0131n\u0131f\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (dependencies) ger\u00e7ek implementasyonlarla birlikte test etmek yerine, bu ba\u011f\u0131ml\u0131l\u0131klar\u0131n aray\u00fcz tabanl\u0131 taklitlerini (mock veya stub) kullanabiliriz. Bu, testlerin daha h\u0131zl\u0131, daha izole ve daha g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, aray\u00fczler yaz\u0131l\u0131m mimarisinde strateji desenleri, fabrika desenleri gibi bir\u00e7ok tasar\u0131m deseninin temelini olu\u015fturur. Bu desenler sayesinde daha d\u00fczenli, geni\u015fletilebilir ve anla\u015f\u0131l\u0131r kod tabanlar\u0131 olu\u015fturabiliriz.<\/p>\n<p>\u00d6zetle, C# aray\u00fczleri sadece bir dil \u00f6zelli\u011fi de\u011fil, ayn\u0131 zamanda sa\u011flam bir yaz\u0131l\u0131m mimarisi in\u015fa etmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Geli\u015ftiriciler olarak, aray\u00fczlerin sundu\u011fu esnekli\u011fi ve g\u00fcc\u00fc kavrayarak, daha kaliteli ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar geli\u015ftirebiliriz. \u015eimdi, C# ekosisteminde s\u0131k\u00e7a kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z temel aray\u00fczlerin kullan\u0131m senaryolar\u0131na ve pratik uygulamalar\u0131na ge\u00e7i\u015f yapal\u0131m.<\/p>\n<div class=\"expert-tip\">\n    <strong>Uzman \u0130pucu:<\/strong> Aray\u00fczler, \u00f6zellikle b\u00fcy\u00fck projelerde ekip \u00fcyelerinin farkl\u0131 mod\u00fcller \u00fczerinde paralel \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r. Bir ekip \u00fcyesi aray\u00fcz\u00fc tan\u0131mlarken, di\u011feri bu aray\u00fcz\u00fc kullanarak kendi mod\u00fcl\u00fcn\u00fc geli\u015ftirebilir, somut implementasyonun haz\u0131r olmas\u0131n\u0131 beklemek zorunda kalmaz.\n<\/div>\n<h2>Temel Koleksiyon Aray\u00fczleri: IEnumerable, ICollection ve IList Nas\u0131l Kullan\u0131l\u0131r?<\/h2>\n<p>C# geli\u015ftiricisi olarak veri yap\u0131lar\u0131yla s\u00fcrekli etkile\u015fim halindeyiz ve bu etkile\u015fimin merkezinde koleksiyonlar bulunur. .NET \u00e7at\u0131s\u0131, koleksiyonlar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir dizi aray\u00fcz sunar. Bunlar aras\u0131nda <code>IEnumerable<T><\/code>, <code>ICollection<T><\/code> ve <code>IList<T><\/code> en s\u0131k kulland\u0131klar\u0131m\u0131zdand\u0131r. Bu aray\u00fczler, kodumuzun farkl\u0131 koleksiyon tipleriyle tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan bir hiyerar\u015fi olu\u015fturur ve polimorfik yakla\u015f\u0131mlar\u0131n kap\u0131lar\u0131n\u0131 aralar. Her birinin ne i\u015fe yarad\u0131\u011f\u0131n\u0131 ve ne zaman kullan\u0131lmalar\u0131 gerekti\u011fini anlamak, daha etkili ve performansl\u0131 C# kodu yazmak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p><strong>IEnumerable<T> Aray\u00fcz\u00fc: Sadece Okuma ve Tekrarlama<\/strong><\/p>\n<p>Koleksiyon aray\u00fczlerinin temelini <code>IEnumerable<T><\/code> olu\u015fturur. Bu aray\u00fcz, bir koleksiyon \u00fczerindeki elemanlar\u0131 tek tek dola\u015fabilme (iterate etme) yetene\u011fini sa\u011flar. Tek bir metot i\u00e7erir: <code>GetEnumerator()<\/code>. Bu metot, elemanlar \u00fczerinde ileriye do\u011fru dola\u015fmam\u0131z\u0131 sa\u011flayan bir numaraland\u0131r\u0131c\u0131 (enumerator) d\u00f6nd\u00fcr\u00fcr. <code>foreach<\/code> d\u00f6ng\u00fcs\u00fc, asl\u0131nda arkas\u0131nda <code>IEnumerable<T><\/code> aray\u00fcz\u00fcn\u00fc kullanarak \u00e7al\u0131\u015f\u0131r. Bu aray\u00fcz\u00fc uygulayan herhangi bir koleksiyonu <code>foreach<\/code> ile gezebilirsiniz.<\/p>\n<p><code>IEnumerable<T><\/code>&#8216;nin temel \u00f6zelli\u011fi, koleksiyonun sadece okunabilir olmas\u0131 ve eleman ekleme\/\u00e7\u0131karma gibi operasyonlara izin vermemesidir. Bu, veri ak\u0131\u015f\u0131n\u0131 veya sadece listeleme gerektiren senaryolarda idealdir. LINQ sorgular\u0131n\u0131n \u00e7o\u011fu da <code>IEnumerable<T><\/code> \u00fczerinde \u00e7al\u0131\u015f\u0131r, zira LINQ, verileri filtrelemek, s\u0131ralamak ve yans\u0131tmak (projection) i\u00e7in bir &#8220;dola\u015f\u0131m&#8221; mant\u0131\u011f\u0131na ihtiya\u00e7 duyar. Performans a\u00e7\u0131s\u0131ndan bak\u0131ld\u0131\u011f\u0131nda, <code>IEnumerable<T><\/code> ile \u00e7al\u0131\u015fmak, verilerin tembel y\u00fcklenmesine (lazy loading) olanak tan\u0131r; yani, elemanlar sadece ihtiya\u00e7 duyuldu\u011funda y\u00fcklenir ve i\u015flenir. Bu, \u00f6zellikle b\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken bellek kullan\u0131m\u0131n\u0131 optimize etmenize yard\u0131mc\u0131 olabilir.<\/p>\n<pre><code class=\"language-csharp\">\npublic void ListeleVeGoster(IEnumerable<string> isimler)\n{\n    foreach (var isim in isimler)\n    {\n        Console.WriteLine(isim);\n    }\n    \/\/ \u0130simler.Add(\"Yeni \u0130sim\"); \/\/ Hata: IEnumerable<T> eklemeye izin vermez\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nList<string> ogrenciler = new List<string> { \"Ali\", \"Ay\u015fe\", \"Mehmet\" };\nListeleVeGoster(ogrenciler); \n<\/pre>\n<p><\/code><\/p>\n<p><strong>ICollection<T> Aray\u00fcz\u00fc: Ekleme, \u00c7\u0131karma ve Sayma Yetenekleri<\/strong><\/p>\n<p><code>ICollection<T><\/code> aray\u00fcz\u00fc, <code>IEnumerable<T><\/code>'den t\u00fcretilmi\u015ftir ve ona ek olarak koleksiyon \u00fczerinde de\u011fi\u015fiklik yapma yetenekleri sunar. Bu aray\u00fcz sayesinde eleman ekleyebilir (<code>Add()<\/code>), \u00e7\u0131karabilir (<code>Remove()<\/code>), t\u00fcm elemanlar\u0131 temizleyebilir (<code>Clear()<\/code>) ve koleksiyonda belirli bir eleman\u0131n olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz (<code>Contains()<\/code>). Ayr\u0131ca, koleksiyonun eleman say\u0131s\u0131n\u0131 veren <code>Count<\/code> \u00f6zelli\u011fine de sahiptir.<\/p>\n<p>Bu aray\u00fcz, bir koleksiyon \u00fczerinde hem okuma hem de temel d\u00fczeyde yazma i\u015flemleri yapman\u0131z gerekti\u011finde tercih edilir. \u00d6rne\u011fin, bir al\u0131\u015fveri\u015f sepetine \u00fcr\u00fcn ekleme veya \u00e7\u0131karma i\u015flevselli\u011fi olan bir s\u0131n\u0131f i\u00e7in <code>ICollection<T><\/code> tipinde bir \u00fcr\u00fcn listesi kullanmak mant\u0131kl\u0131 olacakt\u0131r. Ancak, <code>ICollection<T><\/code> elemanlara indeks \u00fczerinden eri\u015fim veya belirli bir s\u0131raya g\u00f6re eri\u015fim garantisi vermez.<\/p>\n<pre><code class=\"language-csharp\">\npublic void SepeteUrunEkleCikar(ICollection<string> sepet, string urunAdi, bool ekle)\n{\n    if (ekle)\n    {\n        sepet.Add(urunAdi);\n        Console.WriteLine($\"{urunAdi} sepete eklendi. Toplam \u00fcr\u00fcn: {sepet.Count}\");\n    }\n    else\n    {\n        if (sepet.Remove(urunAdi))\n        {\n            Console.WriteLine($\"{urunAdi} sepetten \u00e7\u0131kar\u0131ld\u0131. Toplam \u00fcr\u00fcn: {sepet.Count}\");\n        }\n        else\n        {\n            Console.WriteLine($\"{urunAdi} sepette bulunamad\u0131.\");\n        }\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nHashSet<string> alisverisSepeti = new HashSet<string>(); \/\/ HashSet ICollection<T> uygular\nSepeteUrunEkleCikar(alisverisSepeti, \"Elma\", true);\nSepeteUrunEkleCikar(alisverisSepeti, \"Armut\", true);\nSepeteUrunEkleCikar(alisverisSepeti, \"Elma\", false);\n<\/pre>\n<p><\/code><\/p>\n<p><strong>IList<T> Aray\u00fcz\u00fc: S\u0131ral\u0131 Eri\u015fim ve \u0130ndeksleme<\/strong><\/p>\n<p><code>IList<T><\/code> aray\u00fcz\u00fc, <code>ICollection<T><\/code>'den t\u00fcretilmi\u015ftir ve ona ek olarak elemanlara indeks \u00fczerinden eri\u015fim (<code>[]<\/code> operat\u00f6r\u00fc) ve elemanlar\u0131 belirli bir indekse ekleme (<code>Insert()<\/code>) veya \u00e7\u0131karma (<code>RemoveAt()<\/code>) yetenekleri sunar. Bu aray\u00fcz, elemanlar\u0131n belirli bir s\u0131ras\u0131n\u0131n oldu\u011fu ve bu s\u0131ran\u0131n \u00f6nemli oldu\u011fu durumlarda kullan\u0131l\u0131r. <code>List<T><\/code> s\u0131n\u0131f\u0131, <code>IList<T><\/code>'nin en yayg\u0131n implementasyonudur.<\/p>\n<p><code>IList<T><\/code>, koleksiyonun elemanlar\u0131na rasgele eri\u015fim (random access) sa\u011flar, yani do\u011frudan 5. elemana <code>liste[4]<\/code> ile eri\u015febilirsiniz. Bu, performans a\u00e7\u0131s\u0131ndan, \u00f6zellikle k\u00fc\u00e7\u00fck ve orta boyutlu koleksiyonlarda h\u0131zl\u0131 eri\u015fim anlam\u0131na gelir. Kullan\u0131c\u0131 aray\u00fczlerinde listelenen \u00f6\u011feler, s\u0131ralanm\u0131\u015f veri k\u00fcmeleri veya belirli bir s\u0131raya g\u00f6re i\u015flenmesi gereken veriler i\u00e7in <code>IList<T><\/code> olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\npublic void SiraliListeIslemleri(IList<string> liste)\n{\n    Console.WriteLine($\"Listenin 1. eleman\u0131: {liste[0]}\");\n    liste.Insert(1, \"Portakal\"); \/\/ 1. indekse Portakal ekle\n    liste.RemoveAt(0); \/\/ 0. indeksteki eleman\u0131 \u00e7\u0131kar\n    \n    foreach (var eleman in liste)\n    {\n        Console.WriteLine(eleman);\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nList<string> meyveler = new List<string> { \"Elma\", \"Muz\", \"\u00c7ilek\" };\nSiraliListeIslemleri(meyveler);\n<\/pre>\n<p><\/code><\/p>\n<p><strong>\u00d6zet ve Kar\u015f\u0131la\u015ft\u0131rma<\/strong><\/p>\n<p>Bu \u00fc\u00e7 aray\u00fcz aras\u0131ndaki hiyerar\u015fi ve farklar\u0131 anlamak, do\u011fru koleksiyon tipini se\u00e7menize yard\u0131mc\u0131 olur. A\u015fa\u011f\u0131daki tablo, bu aray\u00fczlerin temel \u00f6zelliklerini \u00f6zetlemektedir:<\/p>\n<table>\n<thead>\n<tr>\n<th>Aray\u00fcz<\/th>\n<th>Temel \u00d6zellik<\/th>\n<th>Kullan\u0131m Alan\u0131<\/th>\n<th>\u00d6rnek S\u0131n\u0131f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>IEnumerable<T><\/code><\/td>\n<td>Sadece ileriye do\u011fru dola\u015f\u0131m (okuma).<\/td>\n<td>LINQ sorgular\u0131, sadece listeleme, tembel y\u00fckleme.<\/td>\n<td><code>List<T><\/code>, <code>Array<\/code>, <code>string<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>ICollection<T><\/code><\/td>\n<td><code>IEnumerable<T><\/code> + Ekleme, \u00e7\u0131karma, temizleme, eleman say\u0131s\u0131n\u0131 alma.<\/td>\n<td>Temel veri y\u00f6netimi (CRUD), eleman ekleme\/\u00e7\u0131karma.<\/td>\n<td><code>List<T><\/code>, <code>HashSet<T><\/code>, <code>Queue<T><\/code><\/td>\n<\/tr>\n<tr>\n<td><code>IList<T><\/code><\/td>\n<td><code>ICollection<T><\/code> + \u0130ndeks \u00fczerinden eri\u015fim, belirli indekse ekleme\/\u00e7\u0131karma.<\/td>\n<td>S\u0131ral\u0131 veri listeleri, UI listeleri, array benzeri eri\u015fim.<\/td>\n<td><code>List<T><\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Do\u011fru aray\u00fcz\u00fc se\u00e7mek, kodunuzu daha esnek hale getirir ve gelecekteki de\u011fi\u015fikliklere kar\u015f\u0131 daha diren\u00e7li k\u0131lar. M\u00fcmk\u00fcn oldu\u011funca, ihtiya\u00e7 duyulan en k\u0131s\u0131tl\u0131 aray\u00fcz tipini kullanmaya \u00e7al\u0131\u015f\u0131n; bu, hem esnekli\u011fi art\u0131r\u0131r hem de istemeden yap\u0131lan de\u011fi\u015fikliklerin \u00f6n\u00fcne ge\u00e7er.<\/p>\n<div class=\"expert-tip\">\n    <strong>Uzman \u0130pucu:<\/strong> E\u011fer sadece koleksiyon elemanlar\u0131n\u0131 dola\u015fman\u0131z gerekiyorsa, her zaman <code>IEnumerable<T><\/code> kullan\u0131n. Bu, kodunuzu daha genel yapar ve underlying koleksiyonun (<code>List<T><\/code>, <code>Array<\/code>, <code>HashSet<T><\/code> vb.) ne oldu\u011fu hakk\u0131nda bilgiye ba\u011f\u0131ml\u0131 olmaz. Bu ilke, \"en az ayr\u0131cal\u0131k\" prensibine de uyar.\n<\/div>\n<h2>Veri Kar\u015f\u0131la\u015ft\u0131rma ve S\u0131ralama: IComparable ve IComparer Ne Zaman Gerekli Olur?<\/h2>\n<p>C# uygulamalar\u0131nda verileri listelemek kadar, onlar\u0131 belirli bir d\u00fczene g\u00f6re s\u0131ralamak da s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir gereksinimdir. \u0130ster say\u0131sal veriler, ister metinler, isterse de kendi tan\u0131mlad\u0131\u011f\u0131m\u0131z kompleks nesneler olsun, s\u0131ralama i\u015flemleri i\u00e7in C# bize iki temel aray\u00fcz sunar: <code>IComparable<T><\/code> ve <code>IComparer<T><\/code>. Bu aray\u00fczler, koleksiyonlar\u0131 varsay\u0131lan veya \u00f6zel kurallara g\u00f6re s\u0131ralamam\u0131za olanak tan\u0131yarak veri y\u00f6netimi yeteneklerimizi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu b\u00f6l\u00fcmde, her iki aray\u00fcz\u00fcn amac\u0131n\u0131, kullan\u0131m \u015fekillerini ve aralar\u0131ndaki farklar\u0131 derinlemesine inceleyece\u011fiz, b\u00f6ylece do\u011fru senaryoda do\u011fru aray\u00fcz\u00fc kullanma becerisini kazanacaks\u0131n\u0131z.<\/p>\n<p><strong>IComparable<T>: Nesnenin Kendi Kendini Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/strong><\/p>\n<p><code>IComparable<T><\/code> aray\u00fcz\u00fc, bir nesnenin kendisini ba\u015fka bir nesneyle kar\u015f\u0131la\u015ft\u0131rabilme yetene\u011fini tan\u0131mlar. Yani, bir s\u0131n\u0131f bu aray\u00fcz\u00fc uygulad\u0131\u011f\u0131nda, o s\u0131n\u0131ftan t\u00fcretilen nesnelerin \"do\u011fal\" veya \"varsay\u0131lan\" bir s\u0131ralama d\u00fczenine sahip olaca\u011f\u0131n\u0131 beyan etmi\u015f oluruz. Bu, genellikle nesnelerin birincil anahtar, ad veya tarih gibi bir \u00f6zelli\u011fine g\u00f6re s\u0131ralanmas\u0131 anlam\u0131na gelir. <code>IComparable<T><\/code> sadece tek bir metot i\u00e7erir: <code>CompareTo(T other)<\/code>.<\/p>\n<p><code>CompareTo<\/code> metodu \u00fc\u00e7 olas\u0131 de\u011fer d\u00f6nd\u00fcr\u00fcr:<\/p>\n<ul>\n<li><code>Negatif say\u0131<\/code>: Bu nesne, parametre olarak verilen nesneden daha k\u00fc\u00e7\u00fckt\u00fcr.<\/li>\n<li><code>S\u0131f\u0131r<\/code>: Bu nesne, parametre olarak verilen nesneye e\u015fittir.<\/li>\n<li><code>Pozitif say\u0131<\/code>: Bu nesne, parametre olarak verilen nesneden daha b\u00fcy\u00fckt\u00fcr.<\/li>\n<\/ul>\n<p>Bu aray\u00fcz\u00fc uygulad\u0131\u011f\u0131n\u0131zda, <code>List<T>.Sort()<\/code> gibi metotlar veya LINQ'deki <code>OrderBy()<\/code> metodu, s\u0131n\u0131f\u0131n\u0131z\u0131n varsay\u0131lan s\u0131ralama mant\u0131\u011f\u0131n\u0131 otomatik olarak kullanabilir. Kendi kompleks nesnelerinizi tan\u0131mlad\u0131\u011f\u0131n\u0131zda ve bu nesnelerin do\u011fal bir s\u0131ralama d\u00fczenine sahip olmas\u0131n\u0131 istedi\u011finizde <code>IComparable<T><\/code> kullanmak olduk\u00e7a pratik bir yakla\u015f\u0131md\u0131r. \u00d6rne\u011fin, bir <code>Personel<\/code> s\u0131n\u0131f\u0131n\u0131z varsa ve personelleri varsay\u0131lan olarak <code>Ad<\/code> \u00f6zelli\u011fine g\u00f6re s\u0131ralamak istiyorsan\u0131z, <code>Personel<\/code> s\u0131n\u0131f\u0131 <code>IComparable<Personel><\/code> aray\u00fcz\u00fcn\u00fc uygulayabilir.<\/p>\n<pre><code class=\"language-csharp\">\npublic class Personel : IComparable<Personel>\n{\n    public string Ad { get; set; }\n    public int Maas { get; set; }\n\n    public Personel(string ad, int maas)\n    {\n        Ad = ad;\n        Maas = maas;\n    }\n\n    \/\/ Ad'a g\u00f6re varsay\u0131lan s\u0131ralama\n    public int CompareTo(Personel other)\n    {\n        if (other == null) return 1;\n        return this.Ad.CompareTo(other.Ad);\n    }\n\n    public override string ToString()\n    {\n        return $\"Ad: {Ad}, Maa\u015f: {Maas}\";\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nList<Personel> personeller = new List<Personel>\n{\n    new Personel(\"Ay\u015fe\", 5000),\n    new Personel(\"Ali\", 7000),\n    new Personel(\"Zeynep\", 6000)\n};\n\nConsole.WriteLine(\"Varsay\u0131lan S\u0131ralama (Ad'a g\u00f6re):\");\npersoneller.Sort(); \/\/ Personel s\u0131n\u0131f\u0131ndaki CompareTo metodunu kullan\u0131r\nforeach (var p in personeller)\n{\n    Console.WriteLine(p);\n}\n<\/pre>\n<p><\/code><\/p>\n<p><strong>IComparer<T>: Harici Kar\u015f\u0131la\u015ft\u0131rma Mant\u0131\u011f\u0131 Tan\u0131mlama<\/strong><\/p>\n<p>Bazen bir s\u0131n\u0131f\u0131n birden fazla s\u0131ralama d\u00fczenine sahip olmas\u0131 gerekebilir veya s\u0131n\u0131f\u0131n kendisini de\u011fi\u015ftirmek istemeyiz. \u0130\u015fte bu durumlarda <code>IComparer<T><\/code> aray\u00fcz\u00fc devreye girer. <code>IComparer<T><\/code>, harici bir kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131 tan\u0131mlamam\u0131za olanak tan\u0131r. Yani, s\u0131ralama mant\u0131\u011f\u0131n\u0131 nesnenin kendisinden ay\u0131r\u0131r\u0131z. Bu aray\u00fcz de tek bir metot i\u00e7erir: <code>Compare(T x, T y)<\/code>.<\/p>\n<p><code>Compare<\/code> metodu, iki nesneyi kar\u015f\u0131la\u015ft\u0131r\u0131r ve yine \u00fc\u00e7 olas\u0131 de\u011fer d\u00f6nd\u00fcr\u00fcr (negatif, s\u0131f\u0131r, pozitif) t\u0131pk\u0131 <code>IComparable<T>.CompareTo<\/code> gibi. <code>IComparer<T><\/code> kullanarak, ayn\u0131 s\u0131n\u0131f\u0131n nesneleri i\u00e7in farkl\u0131 farkl\u0131 s\u0131ralama stratejileri olu\u015fturabiliriz. \u00d6rne\u011fin, <code>Personel<\/code> nesnelerini hem ada g\u00f6re hem de maa\u015fa g\u00f6re s\u0131ralamak isteyebiliriz. Bu durumda, <code>Personel<\/code> s\u0131n\u0131f\u0131n\u0131n kendisini de\u011fi\u015ftirmeden iki ayr\u0131 <code>IComparer<Personel><\/code> implementasyonu olu\u015fturabiliriz.<\/p>\n<pre><code class=\"language-csharp\">\npublic class MaasKarsilastirici : IComparer<Personel>\n{\n    public int Compare(Personel x, Personel y)\n    {\n        if (x == null && y == null) return 0;\n        if (x == null) return -1;\n        if (y == null) return 1;\n        return x.Maas.CompareTo(y.Maas); \/\/ Maa\u015fa g\u00f6re s\u0131ralama\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi (\u00f6nceki personel listesini kullanmaya devam)\nConsole.WriteLine(\"\\nMaa\u015fa G\u00f6re S\u0131ralama:\");\npersoneller.Sort(new MaasKarsilastirici()); \/\/ Harici kar\u015f\u0131la\u015ft\u0131r\u0131c\u0131y\u0131 kullan\u0131r\nforeach (var p in personeller)\n{\n    Console.WriteLine(p);\n}\n<\/pre>\n<p><\/code><\/p>\n<p><strong>IComparable ve IComparer Aras\u0131ndaki Farklar ve Ne Zaman Hangisi Kullan\u0131lmal\u0131?<\/strong><\/p>\n<p>Bu iki aray\u00fcz aras\u0131ndaki temel fark, s\u0131ralama mant\u0131\u011f\u0131n\u0131n nerede tan\u0131mland\u0131\u011f\u0131d\u0131r:<\/p>\n<ul>\n<li><code>IComparable<T><\/code>: Nesnenin *kendi i\u00e7inde* do\u011fal veya varsay\u0131lan bir s\u0131ralama d\u00fczeni tan\u0131mlar. Nesnenin kendisi \"nas\u0131l kar\u015f\u0131la\u015ft\u0131r\u0131laca\u011f\u0131n\u0131\" bilir. Genellikle tek bir varsay\u0131lan s\u0131ralama ihtiyac\u0131 oldu\u011funda kullan\u0131l\u0131r.<\/li>\n<li><code>IComparer<T><\/code>: Nesnelerin *d\u0131\u015f\u0131nda* ayr\u0131 bir kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131 tan\u0131mlar. Farkl\u0131 s\u0131ralama kriterleri (\u00f6rne\u011fin, ada g\u00f6re, maa\u015fa g\u00f6re, ya\u015fa g\u00f6re) gerekti\u011finde veya \u00fc\u00e7\u00fcnc\u00fc parti bir s\u0131n\u0131f\u0131 de\u011fi\u015ftirmeden s\u0131ralamak istedi\u011finizde kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p><strong>\u00d6zetle:<\/strong><\/p>\n<ul>\n<li>E\u011fer nesnelerinizin \"do\u011fal\" bir s\u0131ralama d\u00fczeni varsa ve bu d\u00fczen her yerde ayn\u0131 olacaksa, <code>IComparable<T><\/code> uygulay\u0131n.<\/li>\n<li>E\u011fer nesnelerinizin farkl\u0131 farkl\u0131 s\u0131ralama d\u00fczenlerine g\u00f6re s\u0131ralanmas\u0131 gerekiyorsa veya nesnenin kendisini de\u011fi\u015ftirmek istemiyorsan\u0131z, <code>IComparer<T><\/code> s\u0131n\u0131flar\u0131 olu\u015fturun.<\/li>\n<li>LINQ'deki <code>OrderBy()<\/code> ve <code>ThenBy()<\/code> metotlar\u0131, varsay\u0131lan olarak <code>IComparable<T><\/code>'yi kullan\u0131r. E\u011fer farkl\u0131 bir s\u0131ralama stratejisi istiyorsan\u0131z, <code>OrderBy(x => x.Property)<\/code> veya <code>OrderBy(x => x, new CustomComparer())<\/code> gibi overload'lar\u0131 kullanabilirsiniz.<\/li>\n<\/ul>\n<p>Bu aray\u00fczleri do\u011fru bir \u015fekilde anlamak ve uygulamak, C# uygulamalar\u0131n\u0131zda veri y\u00f6netimi ve sunumu konusunda size b\u00fcy\u00fck bir esneklik sa\u011flayacakt\u0131r. \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken, bu s\u0131ralama yetenekleri kodunuzun okunabilirli\u011fini ve performans\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<div class=\"expert-tip\">\n    <strong>Uzman \u0130pucu:<\/strong> Performans a\u00e7\u0131s\u0131ndan, \u00f6zellikle \u00e7ok b\u00fcy\u00fck koleksiyonlar\u0131 s\u0131ralarken, <code>IComparer<T><\/code> kullanmak bazen <code>IComparable<T><\/code>'ye g\u00f6re daha esnek \u00e7\u00f6z\u00fcmler sunabilir. Ayr\u0131ca, kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131n\u0131 ayr\u0131 bir s\u0131n\u0131fa ta\u015f\u0131yarak Single Responsibility Principle'a (Tek Sorumluluk Prensibi) daha uygun bir tasar\u0131m elde edersiniz.\n<\/div>\n<h2>Kaynak Y\u00f6netimi ve Temizleme: IDisposable Aray\u00fcz\u00fcn\u00fc Do\u011fru \u015eekilde Uygulamak Neden Hayati?<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, belle\u011fi verimli kullanmak ve sistem kaynaklar\u0131n\u0131 do\u011fru bir \u015fekilde y\u00f6netmek, \u00f6zellikle uzun s\u00fcre \u00e7al\u0131\u015fan veya yo\u011fun kaynak kullanan uygulamalar i\u00e7in hayati \u00f6neme sahiptir. C# ve .NET'in otomatik \u00e7\u00f6p toplama (Garbage Collection - GC) \u00f6zelli\u011fi, \u00e7o\u011fu bellek y\u00f6netimini bizim ad\u0131m\u0131za halletse de, y\u00f6netilmeyen kaynaklar (unmanaged resources) denilen \u00f6zel bir kategori vard\u0131r. Dosya tan\u0131t\u0131c\u0131lar\u0131 (file handles), veritaban\u0131 ba\u011flant\u0131lar\u0131, a\u011f soketleri, grafik kaynaklar\u0131 (GDI+ nesneleri) gibi kaynaklar, \u00e7\u00f6p toplay\u0131c\u0131 taraf\u0131ndan otomatik olarak temizlenemez ve bu kaynaklar\u0131n manuel olarak serbest b\u0131rak\u0131lmas\u0131 gerekir. \u0130\u015fte tam bu noktada <code>IDisposable<\/code> aray\u00fcz\u00fc ve <code>using<\/code> deyimi devreye girer.<\/p>\n<p><strong>IDisposable Aray\u00fcz\u00fc Nedir ve Ne \u0130\u015fe Yarar?<\/strong><\/p>\n<p><code>IDisposable<\/code> aray\u00fcz\u00fc, bir nesnenin sahip oldu\u011fu y\u00f6netilmeyen kaynaklar\u0131 serbest b\u0131rakmak veya di\u011fer temizleme i\u015flemlerini ger\u00e7ekle\u015ftirmek i\u00e7in bir mekanizma sa\u011flar. Bu aray\u00fcz, sadece tek bir metot i\u00e7erir: <code>void Dispose()<\/code>. Bir s\u0131n\u0131f <code>IDisposable<\/code> aray\u00fcz\u00fcn\u00fc uygulad\u0131\u011f\u0131nda, bu, o s\u0131n\u0131f\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn sonunda <code>Dispose()<\/code> metodunun \u00e7a\u011fr\u0131lmas\u0131 gerekti\u011fini a\u00e7\u0131k\u00e7a beyan eder. Bu metot i\u00e7inde, nesnenin kulland\u0131\u011f\u0131 t\u00fcm y\u00f6netilmeyen kaynaklar serbest b\u0131rak\u0131lmal\u0131 ve varsa di\u011fer temizlik i\u015flemleri yap\u0131lmal\u0131d\u0131r. Bu, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemenin ve sistemin stabil \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flaman\u0131n anahtar\u0131d\u0131r.<\/p>\n<p><strong>using Deyimi: IDisposable'\u0131 Kolayca Kullanma<\/strong><\/p>\n<p><code>IDisposable<\/code> aray\u00fcz\u00fcn\u00fc manuel olarak \u00e7a\u011f\u0131r\u0131p y\u00f6netmek hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Neyse ki C#, bu i\u015flemi kolayla\u015ft\u0131rmak i\u00e7in <code>using<\/code> deyimini sunar. <code>using<\/code> deyimi, <code>IDisposable<\/code> aray\u00fcz\u00fcn\u00fc uygulayan bir nesnenin kapsam\u0131 d\u0131\u015f\u0131na \u00e7\u0131k\u0131ld\u0131\u011f\u0131nda (veya bir exception f\u0131rlat\u0131ld\u0131\u011f\u0131nda bile) <code>Dispose()<\/code> metodunun otomatik olarak \u00e7a\u011fr\u0131lmas\u0131n\u0131 garanti eder. Bu, hem kod yaz\u0131m\u0131n\u0131 basitle\u015ftirir hem de kaynaklar\u0131n g\u00fcvenli ve zaman\u0131nda serbest b\u0131rak\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ \u00d6rnek: Dosya i\u015flemleri i\u00e7in IDisposable kullan\u0131m\u0131\npublic class DosyaYazici : IDisposable\n{\n    private StreamWriter _writer;\n    private bool _disposed = false;\n\n    public DosyaYazici(string dosyaYolu)\n    {\n        _writer = new StreamWriter(dosyaYolu, true); \/\/ true: append modunda a\u00e7\n        Console.WriteLine($\"'{dosyaYolu}' dosyas\u0131 a\u00e7\u0131ld\u0131.\");\n    }\n\n    public void Yaz(string metin)\n    {\n        if (_disposed)\n        {\n            throw new ObjectDisposedException(nameof(DosyaYazici));\n        }\n        _writer.WriteLine(metin);\n        Console.WriteLine($\"'{metin}' dosyaya yaz\u0131ld\u0131.\");\n    }\n\n    protected virtual void Dispose(bool disposing)\n    {\n        if (!_disposed)\n        {\n            if (disposing)\n            {\n                \/\/ Y\u00f6netilen kaynaklar\u0131 serbest b\u0131rak\n                if (_writer != null)\n                {\n                    _writer.Dispose(); \/\/ StreamWriter da IDisposable uygular\n                    _writer = null;\n                }\n            }\n            \/\/ Y\u00f6netilmeyen kaynaklar\u0131 (varsa) serbest b\u0131rak\n            \/\/ ...\n\n            Console.WriteLine(\"DosyaYazici nesnesi temizlendi.\");\n            _disposed = true;\n        }\n    }\n\n    public void Dispose()\n    {\n        \/\/ Y\u00f6netilen ve y\u00f6netilmeyen kaynaklar\u0131 serbest b\u0131rak.\n        \/\/ Finalize metodunun \u00e7a\u011fr\u0131lmas\u0131n\u0131 engelle.\n        Dispose(true);\n        GC.SuppressFinalize(this); \n    }\n\n    \/\/ Finalizer (destructor): Sadece y\u00f6netilmeyen kaynaklar i\u00e7in kullan\u0131l\u0131r\n    \/\/ ~DosyaYazici() \n    \/\/ {\n    \/\/     Dispose(false);\n    \/\/ }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nstring dosyaYolu = \"log.txt\";\nusing (DosyaYazici yazici = new DosyaYazici(dosyaYolu))\n{\n    yazici.Yaz(\"Bu bir deneme mesaj\u0131d\u0131r.\");\n    yazici.Yaz(\"\u0130kinci sat\u0131r.\");\n} \/\/ Kapsam d\u0131\u015f\u0131na \u00e7\u0131k\u0131ld\u0131\u011f\u0131nda Dispose() otomatik \u00e7a\u011fr\u0131l\u0131r.\n\nConsole.WriteLine(\"Dosya yazma i\u015flemi tamamland\u0131 ve kaynaklar serbest b\u0131rak\u0131ld\u0131.\");\n\n\/\/ E\u011fer DosyaYazici yerine do\u011frudan StreamWriter kullansayd\u0131k:\nusing (StreamWriter sw = new StreamWriter(\"another_log.txt\"))\n{\n    sw.WriteLine(\"Direct StreamWriter kullan\u0131m\u0131.\");\n} \/\/ sw.Dispose() burada otomatik \u00e7a\u011fr\u0131l\u0131r.\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>DosyaYazici<\/code> s\u0131n\u0131f\u0131, <code>StreamWriter<\/code> gibi y\u00f6netilen bir kayna\u011f\u0131 (ki kendisi de <code>IDisposable<\/code> uygular) sarmalamaktad\u0131r. <code>Dispose(bool disposing)<\/code> metodu, temizleme mant\u0131\u011f\u0131n\u0131n hem <code>using<\/code> deyimi \u00fczerinden (<code>disposing = true<\/code>) hem de potansiyel olarak \u00e7\u00f6p toplay\u0131c\u0131 taraf\u0131ndan \u00e7a\u011fr\u0131lan bir finalizer \u00fczerinden (<code>disposing = false<\/code>) \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r. Ancak g\u00fcn\u00fcm\u00fczde, finalizer'lar genellikle sadece do\u011frudan y\u00f6netilmeyen kaynaklar\u0131 sarmalayan s\u0131n\u0131flar i\u00e7in nadiren kullan\u0131l\u0131r ve karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131r\u0131r. Modern C# geli\u015ftirme prati\u011finde, \u00e7o\u011fu durumda sadece <code>Dispose()<\/code> metodu yeterlidir.<\/p>\n<p><strong>IDisposable Neden Hayati?<\/strong><\/p>\n<ol>\n<li><strong>Kaynak S\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00d6nler:<\/strong> Y\u00f6netilmeyen kaynaklar do\u011fru temizlenmedi\u011finde, uygulaman\u0131z belle\u011fi veya di\u011fer sistem kaynaklar\u0131n\u0131 gereksiz yere me\u015fgul ederek performans\u0131 d\u00fc\u015f\u00fcrebilir ve hatta sistemin \u00e7\u00f6kmesine neden olabilir.<\/li>\n<li><strong>Performans\u0131 Art\u0131r\u0131r:<\/strong> Gereksiz kaynaklar\u0131n serbest b\u0131rak\u0131lmas\u0131, uygulaman\u0131z\u0131n daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve \u00f6zellikle yo\u011fun y\u00fck alt\u0131nda daha kararl\u0131 olur.<\/li>\n<li><strong>\u00d6ng\u00f6r\u00fclebilirlik Sa\u011flar:<\/strong> <code>using<\/code> deyimi sayesinde, kaynaklar\u0131n ne zaman serbest b\u0131rak\u0131laca\u011f\u0131n\u0131 kesin olarak biliriz, bu da kodun hata ay\u0131klamas\u0131n\u0131 ve anla\u015f\u0131lmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>G\u00fcvenlik:<\/strong> Baz\u0131 durumlarda a\u00e7\u0131k b\u0131rak\u0131lan kaynaklar (\u00f6rne\u011fin, bir veritaban\u0131 ba\u011flant\u0131s\u0131) g\u00fcvenlik zafiyetlerine yol a\u00e7abilir.<\/li>\n<\/ol>\n<p><strong>Ne Zaman IDisposable Uygulanmal\u0131?<\/strong><\/p>\n<ul>\n<li>Bir s\u0131n\u0131f, dosya ak\u0131\u015flar\u0131, a\u011f ba\u011flant\u0131lar\u0131, veritaban\u0131 ba\u011flant\u0131lar\u0131 gibi y\u00f6netilmeyen kaynaklar\u0131 do\u011frudan kullan\u0131yorsa.<\/li>\n<li>Bir s\u0131n\u0131f, kendisi <code>IDisposable<\/code> olan ba\u015fka nesneleri i\u00e7eriyorsa ve bu nesnelerin de temizlenmesi gerekiyorsa (yukar\u0131daki <code>StreamWriter<\/code> \u00f6rne\u011findeki gibi).<\/li>\n<li>Bir s\u0131n\u0131f, b\u00fcy\u00fck bellek alanlar\u0131 ay\u0131r\u0131yor ve GC'nin bunlar\u0131 ne zaman serbest b\u0131rakaca\u011f\u0131n\u0131 beklemek yerine daha deterministik bir temizleme mekanizmas\u0131 istiyorsa.<\/li>\n<\/ul>\n<p><code>IDisposable<\/code> aray\u00fcz\u00fcn\u00fc ve <code>using<\/code> deyimini do\u011fru bir \u015fekilde kavramak, C# geli\u015ftiricileri i\u00e7in sadece iyi bir pratik de\u011fil, ayn\u0131 zamanda robust ve performansl\u0131 uygulamalar yazmak i\u00e7in vazge\u00e7ilmez bir beceridir. Bu yap\u0131lar sayesinde, sistem kaynaklar\u0131 \u00fczerinde tam kontrol sahibi olabilir ve uygulamalar\u0131n\u0131z\u0131n her zaman en iyi \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<div class=\"expert-tip\">\n    <strong>Uzman \u0130pucu:<\/strong> E\u011fer bir s\u0131n\u0131f\u0131n\u0131zda hem y\u00f6netilen hem de y\u00f6netilmeyen kaynaklar varsa, Dispose desenini (<code>Dispose(bool disposing)<\/code> metodu ve finalizer i\u00e7eren) uygulamak en g\u00fcvenli yoldur. Ancak sadece y\u00f6netilen <code>IDisposable<\/code> nesnelerini i\u00e7eriyorsa, basit bir <code>Dispose()<\/code> metodu ve i\u00e7indeki di\u011fer <code>IDisposable<\/code> nesnelerinin <code>Dispose()<\/code> \u00e7a\u011fr\u0131lar\u0131 yeterlidir.\n<\/div>\n<h2>Geli\u015fmi\u015f Aray\u00fcz Kullan\u0131mlar\u0131: Geni\u015fletilebilir Tasar\u0131mlar \u0130\u00e7in Nelere Dikkat Edilmeli?<\/h2>\n<p>C# aray\u00fczleri, yaln\u0131zca temel davran\u0131\u015flar\u0131 tan\u0131mlamakla kalmaz, ayn\u0131 zamanda daha geli\u015fmi\u015f ve karma\u015f\u0131k yaz\u0131l\u0131m mimarileri olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, aray\u00fczler yaz\u0131l\u0131m\u0131n\u0131z\u0131 esnek, test edilebilir ve gelecekteki de\u011fi\u015fikliklere a\u00e7\u0131k hale getirebilir. Bu b\u00f6l\u00fcmde, deneyimli C# geli\u015ftiricilerinin s\u0131k\u00e7a ba\u015fvurdu\u011fu, aray\u00fczlerle ilgili baz\u0131 ileri d\u00fczey konular\u0131 ve en iyi pratikleri ele alaca\u011f\u0131z. Bu bilgiler, uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p><strong>A\u00e7\u0131k Aray\u00fcz Uygulamas\u0131 (Explicit Interface Implementation)<\/strong><\/p>\n<p>Bir s\u0131n\u0131f birden fazla aray\u00fcz\u00fc uygulad\u0131\u011f\u0131nda ve bu aray\u00fczlerin ayn\u0131 isimde metotlar\u0131 veya \u00f6zellikleri oldu\u011funda \u00e7ak\u0131\u015fmalar meydana gelebilir. Veya bazen, bir aray\u00fcz metodunun sadece o aray\u00fcz tipi \u00fczerinden eri\u015filebilir olmas\u0131n\u0131, s\u0131n\u0131f\u0131n kendi genel API'sinin bir par\u00e7as\u0131 olmamas\u0131n\u0131 isteyebiliriz. \u0130\u015fte bu gibi durumlarda a\u00e7\u0131k aray\u00fcz uygulamas\u0131 devreye girer. A\u00e7\u0131k uygulama, bir aray\u00fcz \u00fcyesini belirli bir aray\u00fcz tipine ba\u011flaman\u0131za olanak tan\u0131r. B\u00f6ylece, o \u00fcye sadece o aray\u00fcz tipi \u00fczerinden eri\u015filebilir olur.<\/p>\n<pre><code class=\"language-csharp\">\npublic interface ILogger\n{\n    void Log(string message);\n}\n\npublic interface IReporter\n{\n    void Log(string message); \/\/ Ayn\u0131 isimde metot\n}\n\npublic class SistemServisi : ILogger, IReporter\n{\n    \/\/ Varsay\u0131lan (implicit) uygulama: her iki aray\u00fcz i\u00e7in de ge\u00e7erli\n    public void Log(string message) \n    {\n        Console.WriteLine($\"Sistem Log: {message}\");\n    }\n\n    \/\/ A\u00e7\u0131k (explicit) aray\u00fcz uygulamas\u0131: Sadece IReporter \u00fczerinden eri\u015filebilir\n    void IReporter.Log(string message) \n    {\n        Console.WriteLine($\"Rapor Log: {message} (Raporlama i\u00e7in \u00f6zel)\");\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nSistemServisi servis = new SistemServisi();\nservis.Log(\"Genel mesaj\"); \/\/ Sistem Log: Genel mesaj\n\nILogger logger = servis;\nlogger.Log(\"Logger mesaj\u0131\"); \/\/ Sistem Log: Logger mesaj\u0131\n\nIReporter reporter = servis;\nreporter.Log(\"Reporter mesaj\u0131\"); \/\/ Rapor Log: Reporter mesaj\u0131 (Raporlama i\u00e7in \u00f6zel)\n\/\/ servis.IReporter.Log(\"Hata\"); \/\/ Hata: Do\u011frudan \u00e7a\u011fr\u0131lamaz\n<\/pre>\n<p><\/code><\/p>\n<p>Bu y\u00f6ntem, \u00f6zellikle bir s\u0131n\u0131f\u0131n \"ana\" i\u015flevselli\u011fi ile bir aray\u00fcz\u00fcn gerektirdi\u011fi \"yard\u0131mc\u0131\" i\u015flevselli\u011fi ay\u0131rmak istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r. Ayr\u0131ca, birden fazla aray\u00fcz\u00fcn ayn\u0131 imzaya sahip \u00fcyelere sahip oldu\u011fu durumlarda isim \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00e7\u00f6zmenin zarif bir yoludur.<\/p>\n<p><strong>Aray\u00fcz Segmentasyon Prensibi (Interface Segregation Principle - ISP)<\/strong><\/p>\n<p>SOLID prensiplerinden biri olan ISP, \"istemcilerin kullanmad\u0131klar\u0131 aray\u00fczlere ba\u011f\u0131ml\u0131 olmaya zorlanmamas\u0131 gerekti\u011fini\" belirtir. Yani, b\u00fcy\u00fck ve \u00e7ok ama\u00e7l\u0131 bir aray\u00fcz yerine, daha k\u00fc\u00e7\u00fck ve \u00f6zel ama\u00e7l\u0131 aray\u00fczler olu\u015fturmak daha iyidir. E\u011fer bir aray\u00fcz \u00e7ok fazla \u00fcye i\u00e7eriyorsa ve bu \u00fcyelerin hepsi her implementasyon taraf\u0131ndan kullan\u0131lm\u0131yorsa, bu aray\u00fcz\u00fc daha k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f aray\u00fczlere b\u00f6lmek gerekir. Bu, kodun esnekli\u011fini, okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>\u00d6rne\u011fin, bir <code>IAraba<\/code> aray\u00fcz\u00fc hem <code>S\u00fcr()<\/code>, <code>FrenYap()<\/code>, <code>H\u0131zlan()<\/code> gibi s\u00fcr\u00fc\u015f metotlar\u0131n\u0131 hem de <code>KapilariKilitle()<\/code>, <code>KlimaAc()<\/code> gibi konfor metotlar\u0131n\u0131 i\u00e7erirse, <code>KapilariKilitle()<\/code> metodunu uygulayamayan bir yar\u0131\u015f arabas\u0131 s\u0131n\u0131f\u0131 i\u00e7in bu aray\u00fcz anlams\u0131z olacakt\u0131r. Bu durumda, aray\u00fcz\u00fc <code>IS\u00fcr\u00fclebilir<\/code> ve <code>IKonforOzellikli<\/code> gibi daha k\u00fc\u00e7\u00fck aray\u00fczlere b\u00f6lmek daha uygun olur.<\/p>\n<p><strong>Varsay\u0131lan Aray\u00fcz Metotlar\u0131 (Default Interface Methods - C# 8.0 ve sonras\u0131)<\/strong><\/p>\n<p>C# 8.0 ile birlikte gelen varsay\u0131lan aray\u00fcz metotlar\u0131, aray\u00fczlere implementasyon eklememize olanak tan\u0131r. Bu, \u00f6zellikle mevcut bir aray\u00fcze yeni bir \u00fcye eklemeniz gerekti\u011finde ve bu aray\u00fcz\u00fc uygulayan t\u00fcm s\u0131n\u0131flar\u0131 tek tek g\u00fcncellemek istemedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r. Varsay\u0131lan implementasyon, eski s\u0131n\u0131flar\u0131n kodunu k\u0131rmadan yeni \u00f6zellikler eklemenizi sa\u011flar. Ayr\u0131ca, mixin tarz\u0131 kal\u0131t\u0131m senaryolar\u0131 i\u00e7in de bir kap\u0131 aralar.<\/p>\n<pre><code class=\"language-csharp\">\npublic interface ILoglayici\n{\n    void Log(string mesaj);\n\n    \/\/ C# 8.0 ile gelen varsay\u0131lan implementasyon\n    void LogHata(string hataMesaji) \n    {\n        Log($\"HATA: {hataMesaji}\");\n    }\n}\n\npublic class Veritaban\u0131Servisi : ILoglayici\n{\n    public void Log(string mesaj)\n    {\n        Console.WriteLine($\"DB Log: {mesaj}\");\n    }\n    \/\/ LogHata() metodunu override etmeye gerek yok, varsay\u0131lan\u0131 kullan\u0131r\n}\n\npublic class DosyaServisi : ILoglayici\n{\n    public void Log(string mesaj)\n    {\n        Console.WriteLine($\"Dosya Log: {mesaj}\");\n    }\n    \/\/ DosyaServisi'ne \u00f6zel bir hata loglama ekleyebiliriz\n    public void LogHata(string hataMesaji)\n    {\n        Console.WriteLine($\"DOSYA HATA! {hataMesaji}\");\n    }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\nILoglayici dbLogger = new Veritaban\u0131Servisi();\ndbLogger.Log(\"Veritaban\u0131 ba\u015flat\u0131ld\u0131.\");\ndbLogger.LogHata(\"Veritaban\u0131 ba\u011flant\u0131 hatas\u0131!\"); \/\/ Varsay\u0131lan\u0131 kullan\u0131r\n\nILoglayici fileLogger = new DosyaServisi();\nfileLogger.Log(\"Dosya servisi aktif.\");\nfileLogger.LogHata(\"Dosya eri\u015fim hatas\u0131!\"); \/\/ DosyaServisi'nin kendi implementasyonunu kullan\u0131r\n<\/pre>\n<p><\/code><\/p>\n<p>Varsay\u0131lan aray\u00fcz metotlar\u0131, aray\u00fcz tabanl\u0131 tasar\u0131mlar\u0131n\u0131za daha fazla esneklik katarken, a\u015f\u0131r\u0131ya ka\u00e7mamaya dikkat etmek \u00f6nemlidir. Temel prensip, aray\u00fczlerin hala bir \"s\u00f6zle\u015fme\" oldu\u011funu ve implementasyon detaylar\u0131ndan m\u00fcmk\u00fcn oldu\u011funca uzak durmas\u0131 gerekti\u011fini unutmamakt\u0131r.<\/p>\n<p><strong>Aray\u00fcz ve Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection - DI)<\/strong><\/p>\n<p>Aray\u00fczlerin belki de en g\u00fc\u00e7l\u00fc kullan\u0131m alanlar\u0131ndan biri Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (DI) ile birlikte kullan\u0131m\u0131d\u0131r. DI, bir s\u0131n\u0131f\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 do\u011frudan olu\u015fturmak yerine, d\u0131\u015far\u0131dan sa\u011flamas\u0131na olanak tan\u0131yan bir tasar\u0131m desenidir. Aray\u00fczler sayesinde, bir s\u0131n\u0131f\u0131n belirli bir hizmetin somut implementasyonuna de\u011fil, sadece o hizmetin aray\u00fcz\u00fcne ba\u011f\u0131ml\u0131 olmas\u0131n\u0131 sa\u011flayabiliriz. Bu, uygulaman\u0131n mod\u00fclerli\u011fini, test edilebilirli\u011fini ve bak\u0131m\u0131n\u0131 muazzam derecede art\u0131r\u0131r.<\/p>\n<p>\u00d6rne\u011fin, bir <code>MusteriServisi<\/code>'nin bir <code>VeriDeposu<\/code>'na ba\u011f\u0131ml\u0131 oldu\u011funu d\u00fc\u015f\u00fcnelim. Do\u011frudan <code>SqlServerVeriDeposu<\/code>'na ba\u011f\u0131ml\u0131 olmak yerine, <code>IMusteriVeriDeposu<\/code> aray\u00fcz\u00fcne ba\u011f\u0131ml\u0131 olabiliriz. Daha sonra, uygulaman\u0131n ba\u015flang\u0131c\u0131nda veya bir DI konteyneri (\u00f6rn. Autofac, Ninject, Microsoft.Extensions.DependencyInjection) kullanarak <code>IMusteriVeriDeposu<\/code> aray\u00fcz\u00fcn\u00fcn hangi somut implementasyonunu (<code>SqlServerVeriDeposu<\/code>, <code>MongoDbVeriDeposu<\/code>, <code>MockMusteriVeriDeposu<\/code> vb.) kullanaca\u011f\u0131n\u0131 belirleyebiliriz. Bu, uygulaman\u0131n farkl\u0131 ortamlarda (test, geli\u015ftirme, \u00fcretim) farkl\u0131 davran\u0131\u015flar sergilemesini kolayla\u015ft\u0131r\u0131r ve kodda de\u011fi\u015fiklik yapmadan altta yatan teknolojiyi de\u011fi\u015ftirmemizi sa\u011flar.<\/p>\n<p>Bu ileri d\u00fczey aray\u00fcz kullan\u0131mlar\u0131, C# uygulamalar\u0131n\u0131z\u0131n mimarisini bir sonraki seviyeye ta\u015f\u0131man\u0131za yard\u0131mc\u0131 olacakt\u0131r. Aray\u00fczler, sadece temel kod yap\u0131s\u0131n\u0131 d\u00fczenlemekle kalmaz, ayn\u0131 zamanda gelecekteki gereksinimlere uyum sa\u011flayabilecek, sa\u011flam ve geni\u015fletilebilir sistemler in\u015fa etmenin de temelini olu\u015fturur.<\/p>\n<div class=\"expert-tip\">\n    <strong>Uzman \u0130pucu:<\/strong> Aray\u00fczleri tasarlarken gelecekteki geni\u015fletmeleri d\u00fc\u015f\u00fcn\u00fcn ancak a\u015f\u0131r\u0131ya ka\u00e7may\u0131n (YAGNI - You Ain't Gonna Need It prensibi). K\u00fc\u00e7\u00fck ve odaklanm\u0131\u015f aray\u00fczler genellikle daha iyi bir se\u00e7enektir. Gerekirse daha sonra birle\u015ftirebilir veya geni\u015fletebilirsiniz.\n<\/div>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Bir Sipari\u015f Y\u00f6netim Sisteminde Aray\u00fczler Nas\u0131l Fark Yarat\u0131r?<\/h2>\n<p>Teorik bilgileri peki\u015ftirmenin en iyi yolu, onlar\u0131 ger\u00e7ek d\u00fcnya senaryolar\u0131nda uygulamakt\u0131r. Bir e-ticaret uygulamas\u0131n\u0131n temelini olu\u015fturan bir sipari\u015f y\u00f6netim sistemi, aray\u00fczlerin g\u00fcc\u00fcn\u00fc ve sa\u011flad\u0131\u011f\u0131 faydalar\u0131 g\u00f6stermek i\u00e7in harika bir \u00f6rnektir. Bu senaryoda, sipari\u015fin al\u0131nmas\u0131ndan \u00f6demeye, sto\u011fun g\u00fcncellenmesinden bildirimlere kadar \u00e7e\u015fitli ad\u0131mlar\u0131 y\u00f6neten bir sistem tasarlarken aray\u00fczlerin nas\u0131l bir esneklik ve s\u00fcrd\u00fcr\u00fclebilirlik sa\u011flad\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<p>Hayal edin ki, bir m\u00fc\u015fteri online ma\u011fazan\u0131zdan bir \u00fcr\u00fcn sipari\u015f ediyor. Bu sipari\u015fin ba\u015far\u0131yla i\u015flenmesi i\u00e7in arka planda bir\u00e7ok farkl\u0131 i\u015flemin koordine edilmesi gerekir. Bu i\u015flemlerin her biri farkl\u0131 bir hizmet veya bile\u015fen taraf\u0131ndan ger\u00e7ekle\u015ftirilebilir. Aray\u00fczler olmadan, t\u00fcm bu bile\u015fenler birbirine s\u0131k\u0131ca ba\u011fl\u0131 (tightly coupled) olurdu ve herhangi bir bile\u015fende yap\u0131lacak k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklik, sistemin di\u011fer k\u0131s\u0131mlar\u0131n\u0131 da etkileyebilirdi. Ancak aray\u00fczler sayesinde, bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 gev\u015fetebilir ve sistemi daha mod\u00fcler hale getirebiliriz.<\/p>\n<p><strong>Senaryo Bile\u015fenleri ve Aray\u00fcz Tasar\u0131m\u0131:<\/strong><\/p>\n<ol>\n<li><strong>Sipari\u015f \u0130\u015fleme:<\/strong> Sipari\u015fin al\u0131nmas\u0131, do\u011frulanmas\u0131 ve ba\u015flang\u0131\u00e7 durumuna getirilmesi.<\/li>\n<li><strong>\u00d6deme \u0130\u015flemi:<\/strong> M\u00fc\u015fteriden \u00f6deme al\u0131nmas\u0131. Farkl\u0131 \u00f6deme y\u00f6ntemleri olabilir (kredi kart\u0131, PayPal, kap\u0131da \u00f6deme vb.).<\/li>\n<li><strong>Stok G\u00fcncelleme:<\/strong> Sipari\u015f edilen \u00fcr\u00fcnlerin stok miktar\u0131n\u0131n azalt\u0131lmas\u0131.<\/li>\n<li><strong>M\u00fc\u015fteri Bildirimi:<\/strong> M\u00fc\u015fteriye sipari\u015fin durumu hakk\u0131nda bilgi verilmesi (e-posta, SMS).<\/li>\n<\/ol>\n<p>Bu bile\u015fenler i\u00e7in aray\u00fczler tan\u0131mlayarak ba\u015flayal\u0131m:<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Sipari\u015f nesnesi (basit bir \u00f6rnek)\npublic class Siparis\n{\n    public int Id { get; set; }\n    public decimal ToplamFiyat { get; set; }\n    public List<string> Urunler { get; set; } = new List<string>();\n    public string MusteriEposta { get; set; }\n    public bool OdemeBasarili { get; set; }\n    public bool StokGuncellendi { get; set; }\n    public string Durum { get; set; } = \"Yeni\";\n}\n\n\/\/ 1. \u00d6deme \u0130\u015flemi Aray\u00fcz\u00fc\npublic interface IOdemeServisi\n{\n    bool OdemeyiIsle(Siparis siparis);\n}\n\n\/\/ 2. Stok Y\u00f6netimi Aray\u00fcz\u00fc\npublic interface IStokServisi\n{\n    bool StokGuncelle(Siparis siparis);\n}\n\n\/\/ 3. Bildirim Aray\u00fcz\u00fc\npublic interface IBildirimServisi\n{\n    void BildirimGonder(Siparis siparis, string mesaj);\n}\n\n\/\/ 4. Ana Sipari\u015f \u0130\u015fleyici Aray\u00fcz\u00fc (Di\u011ferlerini kullanacak)\npublic interface ISiparisIsleyici\n{\n    Siparis SiparisIsle(Siparis siparis);\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu aray\u00fczlerin somut implementasyonlar\u0131n\u0131 olu\u015ftural\u0131m. Farkl\u0131 \u00f6deme y\u00f6ntemleri, farkl\u0131 bildirim kanallar\u0131 veya farkl\u0131 stok y\u00f6netim sistemleri i\u00e7in kolayca yeni s\u0131n\u0131flar ekleyebiliriz:<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Kredi Kart\u0131 \u00d6deme Servisi\npublic class KrediKartiOdemeServisi : IOdemeServisi\n{\n    public bool OdemeyiIsle(Siparis siparis)\n    {\n        Console.WriteLine($\"Sipari\u015f ID: {siparis.Id} i\u00e7in kredi kart\u0131 \u00f6demesi i\u015fleniyor... (Tutar: {siparis.ToplamFiyat:C})\");\n        \/\/ Ger\u00e7ekte burada harici bir \u00f6deme ge\u00e7idi (payment gateway) API'si ile etkile\u015fime girilir.\n        siparis.OdemeBasarili = true; \/\/ Varsay\u0131lan olarak ba\u015far\u0131l\u0131 kabul edelim\n        Console.WriteLine(\"Kredi kart\u0131 \u00f6demesi ba\u015far\u0131l\u0131.\");\n        return true;\n    }\n}\n\n\/\/ PayPal \u00d6deme Servisi\npublic class PayPalOdemeServisi : IOdemeServisi\n{\n    public bool OdemeyiIsle(Siparis siparis)\n    {\n        Console.WriteLine($\"Sipari\u015f ID: {siparis.Id} i\u00e7in PayPal \u00f6demesi i\u015fleniyor... (Tutar: {siparis.ToplamFiyat:C})\");\n        \/\/ PayPal API entegrasyonu\n        siparis.OdemeBasarili = true;\n        Console.WriteLine(\"PayPal \u00f6demesi ba\u015far\u0131l\u0131.\");\n        return true;\n    }\n}\n\n\/\/ Veritaban\u0131 Stok Servisi\npublic class VeritabaniStokServisi : IStokServisi\n{\n    public bool StokGuncelle(Siparis siparis)\n    {\n        Console.WriteLine($\"Sipari\u015f ID: {siparis.Id} i\u00e7in stok g\u00fcncelleniyor: {string.Join(\", \", siparis.Urunler)}\");\n        \/\/ Ger\u00e7ekte veritaban\u0131nda stok miktar\u0131n\u0131 d\u00fc\u015f\u00fcren sorgular \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.\n        siparis.StokGuncellendi = true;\n        Console.WriteLine(\"Stok ba\u015far\u0131yla g\u00fcncellendi.\");\n        return true;\n    }\n}\n\n\/\/ E-posta Bildirim Servisi\npublic class EpostaBildirimServisi : IBildirimServisi\n{\n    public void BildirimGonder(Siparis siparis, string mesaj)\n    {\n        Console.WriteLine($\"M\u00fc\u015fteri '{siparis.MusteriEposta}' adresine e-posta g\u00f6nderiliyor: '{mesaj}'\");\n        \/\/ E-posta g\u00f6nderme API'si kullan\u0131l\u0131r.\n    }\n}\n\n\/\/ SMS Bildirim Servisi\npublic class SMSBildirimServisi : IBildirimServisi\n{\n    public void BildirimGonder(Siparis siparis, string mesaj)\n    {\n        Console.WriteLine($\"M\u00fc\u015fteri cep telefonuna SMS g\u00f6nderiliyor: '{mesaj}'\");\n        \/\/ SMS g\u00f6nderme API'si kullan\u0131l\u0131r.\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi as\u0131l sipari\u015f i\u015fleyici s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015ftural\u0131m. Bu s\u0131n\u0131f, somut implementasyonlara de\u011fil, do\u011frudan aray\u00fczlere ba\u011f\u0131ml\u0131 olacakt\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 constructor (yap\u0131c\u0131 metot) \u00fczerinden enjekte ederek, esnekli\u011fi en \u00fcst d\u00fczeye \u00e7\u0131kar\u0131r\u0131z (Constructor Injection).<\/p>\n<pre><code class=\"language-csharp\">\npublic class SiparisIsleyici : ISiparisIsleyici\n{\n    private readonly IOdemeServisi _odemeServisi;\n    private readonly IStokServisi _stokServisi;\n    private readonly IBildirimServisi _bildirimServisi;\n\n    \/\/ Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu ile servisleri al\u0131yoruz\n    public SiparisIsleyici(IOdemeServisi odemeServisi, IStokServisi stokServisi, IBildirimServisi bildirimServisi)\n    {\n        _odemeServisi = odemeServisi;\n        _stokServisi = stokServisi;\n        _bildirimServisi = bildirimServisi;\n    }\n\n    public Siparis SiparisIsle(Siparis siparis)\n    {\n        Console.WriteLine($\"\\nSipari\u015f {siparis.Id} i\u015flenmeye ba\u015fland\u0131.\");\n\n        \/\/ \u00d6deme i\u015flemi\n        if (_odemeServisi.OdemeyiIsle(siparis))\n        {\n            siparis.Durum = \"\u00d6deme Ba\u015far\u0131l\u0131\";\n            _bildirimServisi.BildirimGonder(siparis, $\"Sipari\u015finiz {siparis.Durum} olarak g\u00fcncellendi.\");\n        }\n        else\n        {\n            siparis.Durum = \"\u00d6deme Ba\u015far\u0131s\u0131z\";\n            _bildirimServisi.BildirimGonder(siparis, $\"Sipari\u015finizde \u00f6deme ba\u015far\u0131s\u0131z oldu.\");\n            return siparis; \/\/ \u00d6deme ba\u015far\u0131s\u0131zsa devam etme\n        }\n\n        \/\/ Stok g\u00fcncelleme\n        if (_stokServisi.StokGuncelle(siparis))\n        {\n            siparis.Durum = \"Stok G\u00fcncellendi, Haz\u0131rlan\u0131yor\";\n            _bildirimServisi.BildirimGonder(siparis, $\"Sipari\u015finiz {siparis.Durum} durumda.\");\n        }\n        else\n        {\n            siparis.Durum = \"Stok G\u00fcncellenemedi\";\n            _bildirimServisi.BildirimGonder(siparis, $\"Sipari\u015finizdeki baz\u0131 \u00fcr\u00fcnlerin stoku yetersiz.\");\n            return siparis;\n        }\n\n        siparis.Durum = \"Tamamland\u0131\";\n        _bildirimServisi.BildirimGonder(siparis, $\"Sipari\u015finiz ba\u015far\u0131yla tamamland\u0131!\");\n        Console.WriteLine($\"Sipari\u015f {siparis.Id} tamamland\u0131. Nihai Durum: {siparis.Durum}\");\n        return siparis;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu sistemi nas\u0131l kullanaca\u011f\u0131m\u0131za bakal\u0131m:<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Senaryo 1: Kredi kart\u0131 ile \u00f6deme ve e-posta bildirimi\nConsole.WriteLine(\"--- Senaryo 1: Kredi Kart\u0131 ve E-posta ---\");\nISiparisIsleyici krediKartiEmailIsleyici = new SiparisIsleyici(\n    new KrediKartiOdemeServisi(),\n    new VeritabaniStokServisi(),\n    new EpostaBildirimServisi()\n);\n\nSiparis siparis1 = new Siparis { Id = 101, ToplamFiyat = 250.75M, MusteriEposta = \"ali@example.com\" };\nsiparis1.Urunler.Add(\"Laptop\");\nsiparis1.Urunler.Add(\"Mouse\");\nkrediKartiEmailIsleyici.SiparisIsle(siparis1);\n\n\/\/ Senaryo 2: PayPal ile \u00f6deme ve SMS bildirimi\nConsole.WriteLine(\"\\n--- Senaryo 2: PayPal ve SMS ---\");\nISiparisIsleyici payPalSmsIsleyici = new SiparisIsleyici(\n    new PayPalOdemeServisi(),\n    new VeritabaniStokServisi(),\n    new SMSBildirimServisi()\n);\n\nSiparis siparis2 = new Siparis { Id = 102, ToplamFiyat = 85.00M, MusteriEposta = \"ayse@example.com\" };\nsiparis2.Urunler.Add(\"Kitap\");\npayPalSmsIsleyici.SiparisIsle(siparis2);\n<\/pre>\n<p><\/code><\/p>\n<p><strong>Aray\u00fczlerin Faydalar\u0131 Bu Senaryoda Nas\u0131l Ortaya \u00c7\u0131k\u0131yor?<\/strong><\/p>\n<ol>\n<li><strong>Esneklik:<\/strong> Yar\u0131n yeni bir \u00f6deme y\u00f6ntemi (\u00f6rne\u011fin \"Bitcoin \u00d6deme\") veya bildirim kanal\u0131 (\u00f6rne\u011fin \"WhatsApp Bildirim\") eklemek istedi\u011fimizde, sadece <code>IOdemeServisi<\/code> veya <code>IBildirimServisi<\/code> aray\u00fcz\u00fcn\u00fc uygulayan yeni bir s\u0131n\u0131f yazmam\u0131z yeterli olur. <code>SiparisIsleyici<\/code> s\u0131n\u0131f\u0131n\u0131n kodunda hi\u00e7bir de\u011fi\u015fiklik yapmam\u0131za gerek kalmaz. Bu, sistemin kolayca geni\u015fletilebilir oldu\u011fu anlam\u0131na gelir.<\/li>\n<li><strong>Test Edilebilirlik:<\/strong> <code>SiparisIsleyici<\/code> s\u0131n\u0131f\u0131n\u0131 birim testlerine tabi tutarken, ger\u00e7ek \u00f6deme, stok veya bildirim servislerini kullanmak zorunda de\u011filiz. Bunlar\u0131n yerine, aray\u00fczleri uygulayan sahte (mock) s\u0131n\u0131flar olu\u015fturarak <code>SiparisIsleyici<\/code>'nin davran\u0131\u015f\u0131n\u0131 izole bir \u015fekilde test edebiliriz. Bu, testleri \u00e7ok daha h\u0131zl\u0131 ve g\u00fcvenilir hale getirir.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Bir \u00f6deme servisinin implementasyonunda bir de\u011fi\u015fiklik oldu\u011funda (\u00f6rne\u011fin, bir API entegrasyonu g\u00fcncellendi\u011finde), bu de\u011fi\u015fiklik sadece ilgili \u00f6deme servis s\u0131n\u0131f\u0131n\u0131 etkiler. Di\u011fer servisler veya <code>SiparisIsleyici<\/code> s\u0131n\u0131f\u0131 bu durumdan haberdar olmak zorunda kalmaz.<\/li>\n<li><strong>Mod\u00fclerlik:<\/strong> Her bir bile\u015fen kendi sorumluluk alan\u0131nda \u00e7al\u0131\u015f\u0131r ve di\u011fer bile\u015fenlerin detaylar\u0131na ba\u011f\u0131ml\u0131 de\u011fildir. Bu, kod taban\u0131n\u0131 daha d\u00fczenli ve anla\u015f\u0131l\u0131r yapar.<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi:<\/strong> Constructor Injection sayesinde, bir <code>SiparisIsleyici<\/code> nesnesi olu\u015fturulurken hangi somut servislerin kullan\u0131laca\u011f\u0131 d\u0131\u015far\u0131dan belirlenir. Bu, farkl\u0131 ortamlar veya farkl\u0131 i\u015f ak\u0131\u015flar\u0131 i\u00e7in farkl\u0131 konfig\u00fcrasyonlar sa\u011flamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ol>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, aray\u00fczler sayesinde, bir sipari\u015f y\u00f6netim sistemi gibi karma\u015f\u0131k bir yap\u0131y\u0131 daha y\u00f6netilebilir, geni\u015fletilebilir ve sa\u011flam bir hale getirmek m\u00fcmk\u00fcnd\u00fcr. Bu prensipleri kendi projelerinize uygulayarak, daha kaliteli ve s\u00fcrd\u00fcr\u00fclebilir yaz\u0131l\u0131mlar geli\u015ftirebilirsiniz.<\/p>\n<div class=\"expert-tip\">\n    <strong>Uzman \u0130pucu:<\/strong> Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, bu t\u00fcr ba\u011f\u0131ml\u0131l\u0131klar\u0131n y\u00f6netimi genellikle bir Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection - DI) konteyneri (\u00f6rne\u011fin, Microsoft.Extensions.DependencyInjection, Autofac, Ninject) taraf\u0131ndan yap\u0131l\u0131r. Bu konteynerler, aray\u00fczlere kar\u015f\u0131l\u0131k gelen somut implementasyonlar\u0131 otomatik olarak sa\u011flayarak kodunuzu daha da temizler ve yap\u0131land\u0131rmay\u0131 merkezi hale getirir.\n<\/div>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makale boyunca, C# aray\u00fczlerinin temelden ileri seviyeye kadar olan kapsam\u0131n\u0131 derinlemesine inceledik. Aray\u00fczlerin, kodumuzun esnekli\u011fini, test edilebilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini nas\u0131l art\u0131rd\u0131\u011f\u0131n\u0131, polimorfizm ve gev\u015fek ba\u011f\u0131ml\u0131l\u0131k gibi kritik yaz\u0131l\u0131m m\u00fchendisli\u011fi prensipleriyle nas\u0131l i\u00e7 i\u00e7e \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m g\u00f6rd\u00fck. <code>IEnumerable<\/code>, <code>ICollection<\/code> ve <code>IList<\/code> gibi temel koleksiyon aray\u00fczlerinden, \u00f6zelle\u015ftirilmi\u015f s\u0131ralama i\u00e7in <code>IComparable<\/code> ve <code>IComparer<\/code>'a, kaynak y\u00f6netimi i\u00e7in hayati \u00f6neme sahip <code>IDisposable<\/code>'a kadar bir\u00e7ok \u00f6nemli aray\u00fcz\u00fc ele ald\u0131k. Ayr\u0131ca, a\u00e7\u0131k aray\u00fcz uygulamas\u0131, varsay\u0131lan metotlar ve Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu ile aray\u00fczlerin ileri d\u00fczey kullan\u0131mlar\u0131n\u0131 ke\u015ffettik ve son olarak bir sipari\u015f y\u00f6netim sistemi senaryosu \u00fczerinden ger\u00e7ek d\u00fcnya uygulamalar\u0131n\u0131 somutla\u015ft\u0131rd\u0131k.<\/p>\n<p>Aray\u00fczler, sadece bir dil \u00f6zelli\u011fi olman\u0131n \u00f6tesinde, iyi tasarlanm\u0131\u015f, sa\u011flam ve uzun \u00f6m\u00fcrl\u00fc yaz\u0131l\u0131m mimarileri in\u015fa etmenin temel ta\u015flar\u0131ndan biridir. Onlar\u0131 do\u011fru anlamak ve etkin bir \u015fekilde kullanmak, her C# geli\u015ftiricisinin yetkinli\u011fini bir \u00fcst seviyeye ta\u015f\u0131yacakt\u0131r. Bu makaledeki bilgilerle, art\u0131k projelerinizde aray\u00fczleri daha bilin\u00e7li ve stratejik bir \u015fekilde kullanarak, daha kaliteli ve y\u00f6netilebilir kodlar yazabilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n<h4>Aray\u00fczler ve Soyut S\u0131n\u0131flar Aras\u0131ndaki Temel Fark Nedir?<\/h4>\n<p>Aray\u00fczler (<code>interface<\/code>) sadece bir s\u00f6zle\u015fme tan\u0131mlar; metot implementasyonu i\u00e7eremezler (C# 8.0 ile gelen varsay\u0131lan metotlar hari\u00e7). Birden fazla aray\u00fcz\u00fc bir s\u0131n\u0131fa uygulayabilirsiniz. Soyut s\u0131n\u0131flar (<code>abstract class<\/code>) ise hem metot tan\u0131mlar\u0131 hem de implementasyonlar i\u00e7erebilir ve sadece tek bir soyut s\u0131n\u0131ftan kal\u0131t\u0131m al\u0131nabilir. Soyut s\u0131n\u0131flar \"nedir\" sorusuna, aray\u00fczler ise \"ne yapabilir\" sorusuna odaklan\u0131r. Aray\u00fczler davran\u0131\u015f s\u00f6zle\u015fmeleri sa\u011flarken, soyut s\u0131n\u0131flar ortak bir temel implementasyon ve davran\u0131\u015f seti sunar.<\/p>\n<\/li>\n<li>\n<h4>Neden m\u00fcmk\u00fcn oldu\u011funca genel aray\u00fcz tipleri kullanmal\u0131y\u0131m (\u00f6rn. <code>IEnumerable<\/code> yerine <code>List<\/code> kullanmamak)?<\/h4>\n<p>M\u00fcmk\u00fcn oldu\u011funca genel aray\u00fcz tipleri (<code>IEnumerable<T><\/code>, <code>ICollection<T><\/code> gibi) kullanmak, kodunuzu daha esnek ve gev\u015fek ba\u011f\u0131ml\u0131 hale getirir. E\u011fer bir metodunuzun sadece elemanlar\u0131 dola\u015fmas\u0131 gerekiyorsa ve <code>List<T><\/code>'ye \u00f6zel hi\u00e7bir \u00f6zelli\u011fe (\u00f6rn. indeks \u00fczerinden eri\u015fim) ihtiyac\u0131 yoksa, <code>IEnumerable<T><\/code> kullanmak, o metodun herhangi bir enumerable koleksiyonla (<code>List<\/code>, <code>Array<\/code>, <code>HashSet<\/code>, \u00f6zel koleksiyonlar vb.) \u00e7al\u0131\u015fabilmesini sa\u011flar. Bu, kodunuzu daha mod\u00fcler ve gelecekteki de\u011fi\u015fikliklere daha diren\u00e7li yapar.<\/p>\n<\/li>\n<li>\n<h4>IDisposable kullan\u0131rken Finalizer'lar (Destructor'lar) hala gerekli mi?<\/h4>\n<p>Modern C# uygulamalar\u0131nda, genellikle <code>IDisposable<\/code> aray\u00fcz\u00fcn\u00fc ve <code>using<\/code> deyimini kullanarak kaynaklar\u0131 temizlemek yeterlidir. Finalizer'lar, yaln\u0131zca do\u011frudan y\u00f6netilmeyen (unmanaged) kaynaklar\u0131 (bellek adresleri, i\u015fletim sistemi handle'lar\u0131 vb.) i\u00e7eren s\u0131n\u0131flar i\u00e7in bir \"g\u00fcvenlik a\u011f\u0131\" olarak d\u00fc\u015f\u00fcn\u00fclmelidir. \u00c7\u00f6p toplay\u0131c\u0131 ne zaman \u00e7al\u0131\u015faca\u011f\u0131 garantilenmedi\u011fi i\u00e7in finalizer'lar kaynaklar\u0131n deterministik olarak temizlenmesini sa\u011flamaz. \u00c7o\u011fu durumda, Finalizer'lar\u0131n kullan\u0131lmas\u0131 performans\u0131 olumsuz etkileyebilir ve karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131rabilir. E\u011fer s\u0131n\u0131f\u0131n\u0131z sadece y\u00f6netilen <code>IDisposable<\/code> nesnelerini sar\u0131yorsa, finalizer'a genellikle gerek yoktur.<\/p>\n<\/li>\n<li>\n<h4>Varsay\u0131lan Aray\u00fcz Metotlar\u0131 ne zaman kullan\u0131lmal\u0131d\u0131r?<\/h4>\n<p>Varsay\u0131lan aray\u00fcz metotlar\u0131 (C# 8.0 ve sonras\u0131), mevcut bir aray\u00fcze geriye d\u00f6n\u00fck uyumlu bir \u015fekilde yeni bir \u00fcye eklemek istedi\u011finizde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. Bu sayede, bu aray\u00fcz\u00fc uygulayan mevcut s\u0131n\u0131flar\u0131n hepsini g\u00fcncellemek zorunda kalmazs\u0131n\u0131z. Ayr\u0131ca, \"mixin\" tarz\u0131 davran\u0131\u015flar eklemek veya k\u00fc\u00e7\u00fck yard\u0131mc\u0131 metotlar sa\u011flamak i\u00e7in de kullan\u0131labilirler. Ancak, aray\u00fczlerin temel amac\u0131 hala bir s\u00f6zle\u015fme tan\u0131mlamak oldu\u011fu i\u00e7in, \u00e7ok karma\u015f\u0131k mant\u0131klar\u0131 varsay\u0131lan metotlara ta\u015f\u0131maktan ka\u00e7\u0131nmak ve genellikle soyut s\u0131n\u0131flara b\u0131rakmak iyi bir pratik olabilir.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"C# geli\u015ftiricisi olarak kodunuzu daha esnek, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek mi istiyorsunuz? Aray\u00fczler, polimorfizm ve gev\u015fek&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[228],"tags":[],"class_list":{"0":"post-33451","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-c","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler<\/title>\n<meta name=\"description\" content=\"C# geli\u015ftiricisi olarak kodunuzu daha esnek, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek mi istiyorsunuz? Aray\u00fczler, polimorfizm ve gev\u015fek ba\u011f\u0131ml\u0131l\u0131k (loose coupling) sayesinde yaz\u0131l\u0131m mimarinizi g\u00fc\u00e7lendirmenin anahtar\u0131d\u0131r.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler\" \/>\n<meta property=\"og:description\" content=\"C# geli\u015ftiricisi olarak kodunuzu daha esnek, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek mi istiyorsunuz? Aray\u00fczler, polimorfizm ve gev\u015fek ba\u011f\u0131ml\u0131l\u0131k (loose coupling) sayesinde yaz\u0131l\u0131m mimarinizi g\u00fc\u00e7lendirmenin anahtar\u0131d\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-02T23:02:56+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"35 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler\",\"datePublished\":\"2025-11-02T23:02:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/\"},\"wordCount\":5367,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"C#\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/\",\"name\":\"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-02T23:02:56+00:00\",\"description\":\"C# geli\u015ftiricisi olarak kodunuzu daha esnek, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek mi istiyorsunuz? Aray\u00fczler, polimorfizm ve gev\u015fek ba\u011f\u0131ml\u0131l\u0131k (loose coupling) sayesinde yaz\u0131l\u0131m mimarinizi g\u00fc\u00e7lendirmenin anahtar\u0131d\u0131r.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler","description":"C# geli\u015ftiricisi olarak kodunuzu daha esnek, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek mi istiyorsunuz? Aray\u00fczler, polimorfizm ve gev\u015fek ba\u011f\u0131ml\u0131l\u0131k (loose coupling) sayesinde yaz\u0131l\u0131m mimarinizi g\u00fc\u00e7lendirmenin anahtar\u0131d\u0131r.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/","og_locale":"tr_TR","og_type":"article","og_title":"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler","og_description":"C# geli\u015ftiricisi olarak kodunuzu daha esnek, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek mi istiyorsunuz? Aray\u00fczler, polimorfizm ve gev\u015fek ba\u011f\u0131ml\u0131l\u0131k (loose coupling) sayesinde yaz\u0131l\u0131m mimarinizi g\u00fc\u00e7lendirmenin anahtar\u0131d\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-02T23:02:56+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"35 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler","datePublished":"2025-11-02T23:02:56+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/"},"wordCount":5367,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["C#"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/","url":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/","name":"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-02T23:02:56+00:00","description":"C# geli\u015ftiricisi olarak kodunuzu daha esnek, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek mi istiyorsunuz? Aray\u00fczler, polimorfizm ve gev\u015fek ba\u011f\u0131ml\u0131l\u0131k (loose coupling) sayesinde yaz\u0131l\u0131m mimarinizi g\u00fc\u00e7lendirmenin anahtar\u0131d\u0131r.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/her-c-gelistiricisinin-bilmesi-gereken-temel-arayuzler\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Her C# Geli\u015ftiricisinin Bilmesi Gereken Temel Aray\u00fczler"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33451"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33451\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}