Delegate Nedir?
Herkese selamlar! Yine ben, yeni bir içerik ile karşınızdayım. 😊 Bugün konumuz, gözlemlediğim kadarıyla nesnel bir öğrenirken birçok kişinin eksik kaldığı veya tam olarak oturtamadığı bir konu olan, delegeler.
Lafı daha fazla uzatmadan direk konuya dalış yapalım. Oluşturacağımız basit bir konsol uygulaması üzerinden ilerleyerek, C# dili üzerinde delegate yapısını anlamaya çalışalım.
C# dili üzerinde delegate yapısı, oldukça önemli bir yer tutmakta. Şahsen bu yapının mantığını kafamda tam olarak oturtmak epey bir zamanımı aldı. Eskiden benim de yaptığım gibi üzerine sürekli çalışarak tam olarak oturtamıyorsanız, gelin bir de farklı bakış açısından yaklaşalım.
Delegate yapısına doğrudan dalmak yerine, farklı bir noktadan yaklaşalım. Delegate’lere neden ihtiyaç duyarız? Bu soruya cevap arayalım.
Hepimizin bildiği üzere, C# programlama dilinde veri tiplerini iki ana gruba ayırıyoruz. Bunlar referans, ve değer tipler.
C# dilindeki veri tiplerini yukarıda görmekteyiz. Buradan şu cümleyi çıkarabiliriz, C# dilindeki her bir methot, parametre olarak yukarıdaki veri tiplerini alabilir. Methotun aldığı parametrenin, veri tipi olmama gibi bir durumu yoktur. Peki ya bir methota, parametre olarak methot göndermek istersek? Buna neden ihtiyaç duyalım dediğinizi duyar gibiyim. İlerlemeye devam edelim..
Delegate dediğimiz yapı, içerisinde methot tutan referans tip bir veri tipidir. Oluşturduğumuz konsol uygulamasında, içerisinde rastgele sayılar barındıran bir listemiz olsun. Bu dizi içerisindeki çift sayıları filtrelemek istiyor olalım. Bunu gayet basit bir methot yazarak gerçekleştirebiliriz.
FilterEvenNumber isimli methotumuzda, sayı listemizde 2 ye modu 0 olan sayıları yeni bir listeye ekleyerek filtrelemiş olduk. Peki, ilerleyen zamanda aynı işlemi 5'in katı olan sayılar için yapmamız gerektiğini varsayalım. Bu durumda aynı şekilde yeni bir methot yazarak, sorunu çözebiliriz.
Gördüğünüz üzere, ihtiyacımız olan her bir yeni durum için, yeni bir methot yazıp sorunu çözebiliyoruz. Peki projemizde, sayılar üzerinde yüzlerce farklı filtreleme işlemi yapıyorsak? Her bir filtreleme işlemi için bir methot mu yazacağız?
İşte, burada en basitinden bir delegate ihtiyacı doğmakta. Filter methotuna parametre olarak filtreleme kriterini iletsek, bizim belirttiğimiz kritere göre filtreleme yapsa nasıl olurdu? Elimizde tüm işlemleri yapabilen tek bir filter methotu olurdu. 😊
Burada bahsedilen filtreleme kriteri, bizim oluşturmuş olduğumuz bir methottur. O halde, filtreleme kriterini tutacak olan delegate’imizi oluşturalım.
Listedeki her bir sayıya uygulanacak olan, şartı sağlıyorsa true, sağlamıyorsa false dönecek olan kriter methotumuzu tutacak delegate yapımız. Artık filter methotumuzu güncelleyelim.
Artık tek bir methot ile, her türlü filtrelemeyi yapabilir hale geldik. Buradaki önemli bilgilerden birisi, C# dilinin eski sürümlerinde delegate üzerinde kullanılacak methotlar yukarıda yaptığımız gibi tek tek tanımlanmalıydı. .Net Framework 3.5 versiyonu ile birlikte, hayatımıza lambda ifadeler girdi.
Lambda ifadeler, aslında anonim(Adı olmayan) methotlar tanımlayabilmemizi sağlayan bir yapıdır. Artık delegate üzerinde kullanacağımız methotları uzun uzun tanımlamadan, doğrudan lambda ifadeler aracılığıyla belirtebiliyoruz. Şimdi, lambda ifadesini kullanarak ve kullanmayarak filtreleme yapalım.
Buradaki bir diğer sıkıntı, hala iletilecek methotu tutacak delegate yapısını yazmak zorunda olmamız. Artık günümüzde, Microsoftun bizim için oluşturduğu, .Net Framework içerisinde built-in gelen delegate yapılarımız var, bunlar Func ve Action delegate’leridir. Generic bir yapıya sahip olan bu delegateler sayesinde, artık delegate yazmak zorunda kalmıyoruz, dönüş tipini ve parametrelerini belirterek doğrudan delegate kullanabiliyoruz. Kodumuzu son kez güncelleyelim.
Func delegate yapısı ile birlikte, filtreleme kriterimizin integer bir parametre aldığını, ve geriye boolean döndüğünü belirttik. Sayılara bu kritere göre filtreleme yapılarak return edilmekte. Son olarak bir kaç filtreleme örneği gerçekleştirelim.
Evet, umarım delegate yapısının ne olduğunu, ve neden ihtiyaç duyulduğunu anlatabilmişimdir.
Elimden geldiğince basit şekilde ve farklı bir bakış açısıyla delegate yapısını anlatmaya çalıştım. Faydalı olması dileğiyle, bir sonraki içerikte görüşmek üzere.. Kendinize çok iyi bakın. 😊