{"id":39249,"date":"2026-02-17T14:30:45","date_gmt":"2026-02-17T11:30:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/"},"modified":"2026-02-17T14:30:45","modified_gmt":"2026-02-17T11:30:45","slug":"c-delegates-ve-events-olay-tabanli-programlamanin-gucu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/","title":{"rendered":"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc"},"content":{"rendered":"<h2>C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc<\/h2>\n<p>C# programlama dilinde esnek ve geni\u015fletilebilir uygulamalar geli\u015ftirmek i\u00e7in Delegates (Temsilciler) ve Events (Olaylar) kritik \u00f6neme sahip yap\u0131lard\u0131r. Bu makale, C# dilinde bu iki g\u00fc\u00e7l\u00fc kavram\u0131n ne oldu\u011funu, nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131, birbirlerinden farklar\u0131n\u0131 ve modern C# geli\u015ftirme s\u00fcre\u00e7lerinde nas\u0131l etkin bir \u015fekilde uygulanabilece\u011fini detayl\u0131 bir \u015fekilde ele alacakt\u0131r.<\/p>\n<h3>Delegates Nedir?<\/h3>\n<p>Delegates, C# dilinde metotlara referans tutabilen, tip g\u00fcvenli bir i\u015faret\u00e7i g\u00f6revi g\u00f6ren \u00f6zel bir veri tipidir. K\u0131sacas\u0131, bir metodu bir de\u011fi\u015fken gibi atayabilir, parametre olarak ge\u00e7irebilir veya bir koleksiyonda saklayabilirsiniz. Bu, fonksiyonel programlama prensiplerine yak\u0131n bir esneklik sa\u011flar ve olay tabanl\u0131 programlaman\u0131n temelini olu\u015fturur.<\/p>\n<h4>Delegate Kavram\u0131<\/h4>\n<p>Delegate, belirli bir imzaya (parametre tipleri ve d\u00f6n\u00fc\u015f tipi) sahip metotlar\u0131 temsil eden bir t\u00fcrd\u00fcr. Bir delegate tan\u0131mlad\u0131\u011f\u0131n\u0131zda, asl\u0131nda bu imzaya uyan herhangi bir metodu i\u015faret edebilecek bir &#8220;\u015fablon&#8221; olu\u015fturmu\u015f olursunuz. Bu sayede, hangi metodun \u00e7a\u011fr\u0131laca\u011f\u0131n\u0131 \u00e7al\u0131\u015fma zaman\u0131nda belirleyebilir ve kodunuzu daha dinamik hale getirebilirsiniz.<\/p>\n<h4>Neden Delegate Kullanmal\u0131y\u0131z?<\/h4>\n<p>Delegates, \u00f6zellikle bir metodun ne zaman veya hangi ko\u015fullar alt\u0131nda \u00e7a\u011fr\u0131laca\u011f\u0131n\u0131 bilmedi\u011fimiz durumlarda veya bir metodun ba\u015fka bir metoda parametre olarak ge\u00e7irilmesi gerekti\u011finde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. Callback (geri \u00e7a\u011f\u0131rma) mekanizmalar\u0131, olay i\u015fleme ve \u00e7oklu yay\u0131n (multicast) senaryolar\u0131 delegates ile kolayca uygulanabilir. Bu, kod tekrar\u0131n\u0131 azalt\u0131r ve daha mod\u00fcler bir tasar\u0131m sa\u011flar.<\/p>\n<h4>Delegate&#8217;lerin Temel Yap\u0131s\u0131<\/h4>\n<p>Bir delegate, <code>delegate<\/code> anahtar kelimesiyle tan\u0131mlan\u0131r. Tan\u0131m\u0131, bir metot imzas\u0131na benzer: d\u00f6n\u00fc\u015f tipi, delegate ad\u0131 ve parametre listesi. \u00d6rne\u011fin, <code>void<\/code> d\u00f6nd\u00fcren ve bir <code>string<\/code> parametresi alan bir metodu temsil eden bir delegate \u015f\u00f6yle tan\u0131mlanabilir:<\/p>\n<pre><code class=\"language-csharp\">\npublic delegate void MesajGosterici(string mesaj);\n<\/pre>\n<p><\/code><\/p>\n<p>Bu tan\u0131m, <code>MesajGosterici<\/code> ad\u0131nda bir delegate tipi olu\u015fturur. Bu tip, <code>void<\/code> d\u00f6nd\u00fcren ve tek bir <code>string<\/code> parametresi alan herhangi bir metodu temsil edebilir.<\/p>\n<h3>Delegate Tan\u0131mlama ve Kullan\u0131m<\/h3>\n<p>Delegates, programlamada esneklik sa\u011flayarak, \u00e7al\u0131\u015fma zaman\u0131nda hangi metodun \u00e7a\u011fr\u0131laca\u011f\u0131na karar verme imkan\u0131 sunar. Bu b\u00f6l\u00fcm, bir delegate'in nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131, bir metoda nas\u0131l atand\u0131\u011f\u0131n\u0131 ve nas\u0131l \u00e7a\u011fr\u0131ld\u0131\u011f\u0131n\u0131 detayl\u0131 \u00f6rneklerle a\u00e7\u0131klar.<\/p>\n<h4>Delegate Tan\u0131mlama S\u00f6zdizimi<\/h4>\n<p>Delegate tan\u0131mlamas\u0131, bir metot imzas\u0131 gibi yap\u0131l\u0131r, ancak ba\u015f\u0131na <code>delegate<\/code> anahtar kelimesi eklenir. Genel s\u00f6zdizimi \u015f\u00f6yledir:<\/p>\n<pre><code class=\"language-csharp\">\n[eri\u015fim_belirleyici] delegate [d\u00f6n\u00fc\u015f_tipi] [DelegateAd\u0131]([parametre_listesi]);\n<\/pre>\n<p><\/code><\/p>\n<p>\u00d6rnek olarak, iki tam say\u0131y\u0131 al\u0131p bir tam say\u0131 d\u00f6nd\u00fcren bir delegate tan\u0131mlayal\u0131m:<\/p>\n<pre><code class=\"language-csharp\">\npublic delegate int HesaplamaDelegate(int a, int b);\n<\/pre>\n<p><\/code><\/p>\n<h4>Delegate Nesnesi Olu\u015fturma<\/h4>\n<p>Tan\u0131mlanan delegate tipi, art\u0131k bir s\u0131n\u0131f gibi kullan\u0131labilir. Bir delegate nesnesi olu\u015fturmak i\u00e7in, delegate tipini ve bu tipe uygun imzaya sahip bir metodu belirtmeniz gerekir. Metot, statik veya \u00f6rnek metot olabilir.<\/p>\n<pre><code class=\"language-csharp\">\npublic class Hesaplayici\n{\n    public int Topla(int x, int y) { return x + y; }\n    public int Carp(int x, int y) { return x * y; }\n}\n\n\/\/ Delegate nesnesi olu\u015fturma\nHesaplayici hesaplayici = new Hesaplayici();\nHesaplamaDelegate toplayici = new HesaplamaDelegate(hesaplayici.Topla);\nHesaplamaDelegate carpan = hesaplayici.Carp; \/\/ Daha k\u0131sa s\u00f6zdizimi (C# 2.0 sonras\u0131)\n<\/pre>\n<p><\/code><\/p>\n<h4>Delegate \u00c7a\u011f\u0131rma<\/h4>\n<p>Bir delegate nesnesi, t\u0131pk\u0131 bir metot gibi \u00e7a\u011fr\u0131labilir. Delegate'i \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zda, delegate'in i\u015faret etti\u011fi metot veya metotlar \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\nint sonucToplama = toplayici(5, 3); \/\/ Topla metodu \u00e7a\u011fr\u0131l\u0131r\nConsole.WriteLine($\"Toplama Sonucu: {sonucToplama}\"); \/\/ \u00c7\u0131kt\u0131: 8\n\nint sonucCarpma = carpan(5, 3); \/\/ Carp metodu \u00e7a\u011fr\u0131l\u0131r\nConsole.WriteLine($\"\u00c7arpma Sonucu: {sonucCarpma}\"); \/\/ \u00c7\u0131kt\u0131: 15\n<\/pre>\n<p><\/code><\/p>\n<h4>\u00d6rnek Uygulama<\/h4>\n<p>A\u015fa\u011f\u0131daki \u00f6rnek, bir delegate'in farkl\u0131 metotlar\u0131 nas\u0131l temsil edebilece\u011fini ve \u00e7al\u0131\u015fma zaman\u0131nda nas\u0131l kullan\u0131labilece\u011fini g\u00f6sterir:<\/p>\n<pre><code class=\"language-csharp\">\nusing System;\n\npublic delegate void YaziciDelegate(string metin);\n\npublic class Program\n{\n    public static void KonsolaYaz(string mesaj)\n    {\n        Console.WriteLine($\"Konsol: {mesaj}\");\n    }\n\n    public static void HataGoster(string hataMesaji)\n    {\n        Console.Error.WriteLine($\"HATA: {hataMesaji}\");\n    }\n\n    public static void Main(string[] args)\n    {\n        YaziciDelegate yazici;\n\n        \/\/ KonsolaYaz metodunu temsil et\n        yazici = KonsolaYaz;\n        yazici(\"Merhaba D\u00fcnya!\");\n\n        \/\/ HataGoster metodunu temsil et\n        yazici = HataGoster;\n        yazici(\"Bir hata olu\u015ftu!\");\n\n        \/\/ Anonim metot veya lambda ifadesi ile de kullan\u0131labilir\n        yazici = (m) => Console.WriteLine($\"Lambda Yaz\u0131c\u0131: {m}\");\n        yazici(\"Lambda ile yaz\u0131ld\u0131.\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Multicast Delegates (\u00c7oklu Yay\u0131n Delegeleri)<\/h3>\n<p>Delegates'in en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, birden fazla metodu ayn\u0131 anda \u00e7a\u011f\u0131rabilme yetene\u011fidir. Bu \u00f6zelli\u011fe \"Multicast Delegates\" veya \"\u00c7oklu Yay\u0131n Delegeleri\" denir. Bu sayede, tek bir delegate \u00e7a\u011fr\u0131s\u0131 ile birden fazla i\u015flevi tetikleyebilirsiniz.<\/p>\n<h4>Birden Fazla Metodu \u0130li\u015fkilendirme<\/h4>\n<p>Bir delegate nesnesine birden fazla metot eklemek i\u00e7in <code>+<\/code> veya <code>+=<\/code> operat\u00f6rleri kullan\u0131l\u0131r. Bu, delegate'in bir \"\u00e7a\u011f\u0131rma listesi\" olu\u015fturmas\u0131n\u0131 sa\u011flar. \u00c7a\u011f\u0131rma listesindeki metotlar, delegate \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda s\u0131rayla y\u00fcr\u00fct\u00fcl\u00fcr.<\/p>\n<pre><code class=\"language-csharp\">\npublic delegate void BenimDelegate(string mesaj);\n\npublic class Bildirimci\n{\n    public static void EmailGonder(string msg) { Console.WriteLine($\"Email g\u00f6nderildi: {msg}\"); }\n    public static void SMSGonder(string msg) { Console.WriteLine($\"SMS g\u00f6nderildi: {msg}\"); }\n    public static void LogYaz(string msg) { Console.WriteLine($\"Log yaz\u0131ld\u0131: {msg}\"); }\n}\n\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        BenimDelegate multicastDelegate = null;\n\n        multicastDelegate += Bildirimci.EmailGonder;\n        multicastDelegate += Bildirimci.SMSGonder;\n        multicastDelegate += Bildirimci.LogYaz;\n\n        multicastDelegate(\"Yeni bir i\u015flem tamamland\u0131!\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>multicastDelegate<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda s\u0131ras\u0131yla <code>EmailGonder<\/code>, <code>SMSGonder<\/code> ve <code>LogYaz<\/code> metotlar\u0131 \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<h4>Delegate Zincirleme<\/h4>\n<p>Metotlar\u0131 bir delegate'e ekleyebildi\u011fimiz gibi, <code>-<\/code> veya <code>-=<\/code> operat\u00f6rlerini kullanarak \u00e7a\u011fr\u0131 listesinden metotlar\u0131 \u00e7\u0131karabiliriz. Bu, delegate zincirini dinamik olarak y\u00f6netmemizi sa\u011flar.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ \u00d6nceki \u00f6rnekten devam...\nmulticastDelegate -= Bildirimci.SMSGonder; \/\/ SMSGonder'i listeden \u00e7\u0131kar\n\nConsole.WriteLine(\"\\nSMS g\u00f6nderimi iptal edildi:\");\nmulticastDelegate(\"\u00d6nemli bir duyuru!\");\n<\/pre>\n<p><\/code><\/p>\n<p>Bu durumda, sadece <code>EmailGonder<\/code> ve <code>LogYaz<\/code> metotlar\u0131 \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<h4>Kullan\u0131m Senaryolar\u0131<\/h4>\n<p>Multicast delegates, \u00f6zellikle olay i\u015fleme mekanizmalar\u0131n\u0131n temelini olu\u015fturur. Bir olay meydana geldi\u011finde, bu olaya abone olan t\u00fcm metotlar\u0131n otomatik olarak \u00e7a\u011fr\u0131lmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, bir i\u015flemi tamamlad\u0131ktan sonra birden fazla farkl\u0131 eylemi (\u00f6rne\u011fin, loglama, bildirim g\u00f6nderme, veritaban\u0131 g\u00fcncelleme) tetiklemek i\u00e7in de kullan\u0131labilir.<\/p>\n<h3>Events Nedir?<\/h3>\n<p>Events (Olaylar), C# dilinde bir nesnenin belirli bir eylem ger\u00e7ekle\u015ftirdi\u011fini veya durumunun de\u011fi\u015fti\u011fini di\u011fer nesnelere bildirmek i\u00e7in kullan\u0131lan \u00f6zel bir delegate t\u00fcr\u00fcd\u00fcr. Olaylar, Publisher-Subscriber (Yay\u0131nc\u0131-Abone) tasar\u0131m deseninin C# dilindeki somut bir uygulamas\u0131d\u0131r ve gev\u015fek ba\u011fl\u0131 sistemler olu\u015fturman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h4>Olay Tabanl\u0131 Programlama<\/h4>\n<p>Olay tabanl\u0131 programlama, bir program\u0131n ak\u0131\u015f\u0131n\u0131n olaylar taraf\u0131ndan belirlendi\u011fi bir paradigmada \u00e7al\u0131\u015f\u0131r. Bir d\u00fc\u011fmeye t\u0131klama, bir veri y\u00fckleme i\u015flemi veya bir dosyan\u0131n kaydedilmesi gibi eylemler birer olayd\u0131r. Program, bu olaylara yan\u0131t veren kod par\u00e7ac\u0131klar\u0131 (olay i\u015fleyicileri) yazarak tepki verir. Events, bu olay i\u015fleyicilerini y\u00f6netmek i\u00e7in g\u00fcvenli ve standart bir yol sunar.<\/p>\n<h4>Publisher-Subscriber Deseni<\/h4>\n<p>Events, Publisher-Subscriber desenini uygular:<br \/>\n*   <strong>Publisher (Yay\u0131nc\u0131):<\/strong> Olay\u0131 f\u0131rlatan (raise eden) nesnedir. Olay\u0131n ne zaman ger\u00e7ekle\u015fti\u011fini ve hangi verileri ta\u015f\u0131d\u0131\u011f\u0131n\u0131 bilir, ancak olaya kimin abone oldu\u011funu veya nas\u0131l i\u015flenece\u011fini bilmez.<br \/>\n*   <strong>Subscriber (Abone):<\/strong> Olay\u0131 dinleyen ve olaya yan\u0131t veren nesnelerdir. Olay meydana geldi\u011finde belirli bir eylemi ger\u00e7ekle\u015ftirirler. Abone, olaya abone olur ve i\u015fleyicisini sa\u011flar.<\/p>\n<p>Bu ayr\u0131m, yay\u0131nc\u0131 ve abone aras\u0131nda g\u00fc\u00e7l\u00fc bir ba\u011f\u0131ml\u0131l\u0131k olmamas\u0131n\u0131 sa\u011flar, bu da kodun daha mod\u00fcler ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Event'lerin Avantajlar\u0131<\/h4>\n<p>*   <strong>Gev\u015fek Ba\u011fl\u0131l\u0131k:<\/strong> Yay\u0131nc\u0131 ve abone aras\u0131nda do\u011frudan bir ba\u011f\u0131ml\u0131l\u0131k yoktur. Bu, bir bile\u015fenin di\u011ferini etkilemeden de\u011fi\u015ftirilebilece\u011fi anlam\u0131na gelir.<br \/>\n*   <strong>Kaps\u00fclleme:<\/strong> Events, delegate'lerin d\u0131\u015far\u0131dan do\u011frudan \u00e7a\u011fr\u0131lmas\u0131n\u0131 engeller. Sadece s\u0131n\u0131f\u0131n i\u00e7inden olay f\u0131rlat\u0131labilir. Bu, kontrol\u00fc ve g\u00fcvenli\u011fi art\u0131r\u0131r.<br \/>\n*   <strong>Esneklik:<\/strong> Birden fazla abone, ayn\u0131 olaya yan\u0131t verebilir. Yeni aboneler kolayca eklenebilir veya \u00e7\u0131kar\u0131labilir.<br \/>\n*   <strong>Standartla\u015fma:<\/strong> C# olaylar\u0131, <code>EventHandler<\/code> ve <code>EventArgs<\/code> gibi standart desenler kullanarak tutarl\u0131 bir olay i\u015fleme mekanizmas\u0131 sa\u011flar.<\/p>\n<h3>Event Tan\u0131mlama ve Kullan\u0131m<\/h3>\n<p>Events, C# dilinde <code>event<\/code> anahtar kelimesi kullan\u0131larak tan\u0131mlan\u0131r ve genellikle bir delegate tipi ile ili\u015fkilendirilir. Bu b\u00f6l\u00fcm, bir event'in nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131, f\u0131rlat\u0131ld\u0131\u011f\u0131n\u0131 ve abone olunup \u00e7\u0131k\u0131ld\u0131\u011f\u0131n\u0131 detayl\u0131 \u00f6rneklerle a\u00e7\u0131klar.<\/p>\n<h4>Event Tan\u0131mlama S\u00f6zdizimi<\/h4>\n<p>Bir event, <code>event<\/code> anahtar kelimesiyle ve ard\u0131ndan bir delegate tipi ve event ad\u0131 ile tan\u0131mlan\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\npublic delegate void OlayIsleyici(object sender, EventArgs e); \/\/ Genellikle kullan\u0131lan standart delegate\n\npublic class MyPublisher\n{\n    public event OlayIsleyici MyEvent; \/\/ MyEvent ad\u0131nda bir olay tan\u0131mland\u0131\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yayg\u0131n olarak kullan\u0131lan standart <code>EventHandler<\/code> delegate'i ve <code>EventArgs<\/code> s\u0131n\u0131f\u0131 ile tan\u0131mlama \u015f\u00f6yledir:<\/p>\n<pre><code class=\"language-csharp\">\npublic class MyPublisher\n{\n    public event EventHandler MyEvent; \/\/ Standart EventHandler delegate'i kullan\u0131ld\u0131\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Event F\u0131rlatma (Raising an Event)<\/h4>\n<p>Bir event, sadece tan\u0131mland\u0131\u011f\u0131 s\u0131n\u0131f\u0131n i\u00e7inden f\u0131rlat\u0131labilir. Olay\u0131 f\u0131rlatmak, asl\u0131nda event ile ili\u015fkili delegate'i \u00e7a\u011f\u0131rmak anlam\u0131na gelir. F\u0131rlatmadan \u00f6nce, event'in <code>null<\/code> olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek iyi bir pratiktir, \u00e7\u00fcnk\u00fc hi\u00e7bir abone yoksa <code>NullReferenceException<\/code> hatas\u0131 alabilirsiniz.<\/p>\n<pre><code class=\"language-csharp\">\npublic class MyPublisher\n{\n    public event EventHandler MyEvent;\n\n    public void DoSomething()\n    {\n        Console.WriteLine(\"\u0130\u015flem yap\u0131l\u0131yor...\");\n        \/\/ Event'i f\u0131rlat\n        OnMyEvent(EventArgs.Empty); \/\/ E\u011fer \u00f6zel veri yoksa EventArgs.Empty kullan\u0131l\u0131r\n    }\n\n    \/\/ Olay f\u0131rlatma metodunu kaps\u00fcllemek i\u00e7in Protected Virtual metot deseni\n    protected virtual void OnMyEvent(EventArgs e)\n    {\n        MyEvent?.Invoke(this, e); \/\/ Null kontrol\u00fc ve event'i f\u0131rlatma\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>MyEvent?.Invoke(this, e);<\/code> ifadesi, <code>MyEvent<\/code> delegate'i <code>null<\/code> de\u011filse <code>Invoke<\/code> metodunu \u00e7a\u011f\u0131r\u0131r. <code>this<\/code> parametresi, olay\u0131 f\u0131rlatan nesneyi (yay\u0131nc\u0131y\u0131) temsil ederken, <code>e<\/code> parametresi olayla ilgili verileri ta\u015f\u0131r.<\/p>\n<h4>Event'e Abone Olma ve Abonelikten \u00c7\u0131kma<\/h4>\n<p>Di\u011fer s\u0131n\u0131flar veya nesneler, bir event'e <code>+=<\/code> operat\u00f6r\u00fcn\u00fc kullanarak abone olabilirler. Abonelikten \u00e7\u0131kmak i\u00e7in ise <code>-=<\/code> operat\u00f6r\u00fc kullan\u0131l\u0131r. Bu, multicast delegates'teki metot ekleme\/\u00e7\u0131karma i\u015flemine benzer.<\/p>\n<pre><code class=\"language-csharp\">\npublic class MySubscriber\n{\n    public void HandleMyEvent(object sender, EventArgs e)\n    {\n        Console.WriteLine(\"Abone: MyEvent olay\u0131 i\u015flendi!\");\n        MyPublisher publisher = sender as MyPublisher;\n        if (publisher != null)\n        {\n            Console.WriteLine($\"Abone: Olay\u0131 f\u0131rlatan: {publisher.GetType().Name}\");\n        }\n    }\n}\n\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        MyPublisher publisher = new MyPublisher();\n        MySubscriber subscriber = new MySubscriber();\n\n        \/\/ Event'e abone ol\n        publisher.MyEvent += subscriber.HandleMyEvent;\n\n        publisher.DoSomething(); \/\/ Olay\u0131 f\u0131rlatacak\n\n        \/\/ Event'ten abonelikten \u00e7\u0131k\n        publisher.MyEvent -= subscriber.HandleMyEvent;\n\n        Console.WriteLine(\"\\nAbonelikten \u00e7\u0131k\u0131ld\u0131. Tekrar i\u015flem yap\u0131l\u0131yor...\");\n        publisher.DoSomething(); \/\/ Bu sefer abone metodu \u00e7a\u011fr\u0131lmayacak\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>MySubscriber<\/code> s\u0131n\u0131f\u0131 <code>MyPublisher<\/code>'\u0131n <code>MyEvent<\/code> olay\u0131na abone olur, olay f\u0131rlat\u0131ld\u0131\u011f\u0131nda <code>HandleMyEvent<\/code> metodu \u00e7al\u0131\u015f\u0131r ve ard\u0131ndan abonelikten \u00e7\u0131karak bir sonraki olay f\u0131rlatmas\u0131nda tepki vermez.<\/p>\n<h3>Standart Event Desenleri<\/h3>\n<p>C# dilinde olaylar\u0131 tan\u0131mlarken ve kullan\u0131rken belirli bir desen (pattern) izlenmesi \u00f6nerilir. Bu desen, <code>EventHandler<\/code> delegate'i ve <code>EventArgs<\/code> s\u0131n\u0131f\u0131n\u0131n kullan\u0131m\u0131yla tutarl\u0131 ve anla\u015f\u0131l\u0131r bir yap\u0131 sa\u011flar.<\/p>\n<h4>EventHandler ve EventArgs<\/h4>\n<p>*   <strong><code>EventHandler<\/code> Delegate'i:<\/strong> .NET Framework, olaylar i\u00e7in standart bir delegate tipi olan <code>EventHandler<\/code>'\u0131 sa\u011flar. Bu delegate, <code>void<\/code> d\u00f6nd\u00fcr\u00fcr ve iki parametre al\u0131r:<br \/>\n    *   <code>object sender<\/code>: Olay\u0131 f\u0131rlatan nesneye bir referanst\u0131r.<br \/>\n    *   <code>EventArgs e<\/code>: Olayla ilgili verileri i\u00e7eren bir nesnedir. E\u011fer olay herhangi bir \u00f6zel veri ta\u015f\u0131m\u0131yorsa <code>EventArgs.Empty<\/code> kullan\u0131labilir.<\/p>\n<pre><code class=\"language-csharp\">\n    public delegate void EventHandler(object sender, EventArgs e);\n    <\/pre>\n<p><\/code><\/p>\n<p>*   <strong><code>EventHandler<TEventArgs><\/code> Generic Delegate:<\/strong> E\u011fer olay\u0131n\u0131z \u00f6zel veri ta\u015f\u0131yorsa, <code>EventHandler<TEventArgs><\/code> generic delegate'ini kullanmak daha iyidir. Burada <code>TEventArgs<\/code>, <code>EventArgs<\/code> s\u0131n\u0131f\u0131ndan t\u00fcretilmi\u015f \u00f6zel bir s\u0131n\u0131f olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-csharp\">\n    public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs : EventArgs;\n    <\/pre>\n<p><\/code><\/p>\n<h4>Custom EventArgs S\u0131n\u0131flar\u0131<\/h4>\n<p>Olay\u0131n\u0131z\u0131n, olay\u0131 i\u015fleyecek abonelere \u00f6zel bilgiler iletmesi gerekti\u011finde, <code>EventArgs<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreyen kendi \u00f6zel s\u0131n\u0131f\u0131n\u0131z\u0131 olu\u015fturmal\u0131s\u0131n\u0131z.<\/p>\n<pre><code class=\"language-csharp\">\npublic class CustomDataEventArgs : EventArgs\n{\n    public string Message { get; }\n    public DateTime EventTime { get; }\n\n    public CustomDataEventArgs(string message, DateTime eventTime)\n    {\n        Message = message;\n        EventTime = eventTime;\n    }\n}\n\npublic class DataProcessor\n{\n    \/\/ Generic EventHandler kullan\u0131ld\u0131\n    public event EventHandler<CustomDataEventArgs> DataProcessed;\n\n    public void ProcessData(string data)\n    {\n        Console.WriteLine($\"Veri i\u015fleniyor: {data}\");\n        \/\/ Olay\u0131 f\u0131rlat\u0131rken \u00f6zel veri iletiliyor\n        OnDataProcessed(new CustomDataEventArgs($\"'{data}' verisi i\u015flendi.\", DateTime.Now));\n    }\n\n    protected virtual void OnDataProcessed(CustomDataEventArgs e)\n    {\n        DataProcessed?.Invoke(this, e);\n    }\n}\n\npublic class DataConsumer\n{\n    public void HandleDataProcessed(object sender, CustomDataEventArgs e)\n    {\n        Console.WriteLine($\"T\u00fcketici: Olay f\u0131rlat\u0131ld\u0131: '{e.Message}' - Zaman: {e.EventTime}\");\n    }\n}\n\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        DataProcessor processor = new DataProcessor();\n        DataConsumer consumer = new DataConsumer();\n\n        processor.DataProcessed += consumer.HandleDataProcessed;\n        processor.ProcessData(\"\u00d6rnek Veri 123\");\n        processor.DataProcessed -= consumer.HandleDataProcessed;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Genel Kullan\u0131m \u0130pu\u00e7lar\u0131<\/h4>\n<p>*   Olay f\u0131rlatma metodunu <code>On[EventAd\u0131]<\/code> \u015feklinde adland\u0131r\u0131n (\u00f6rn. <code>OnDataProcessed<\/code>).<br \/>\n*   Bu metodu <code>protected virtual<\/code> olarak tan\u0131mlay\u0131n, b\u00f6ylece t\u00fcretilmi\u015f s\u0131n\u0131flar olay\u0131 f\u0131rlatma davran\u0131\u015f\u0131n\u0131 \u00f6zelle\u015ftirebilir.<br \/>\n*   Olay\u0131 f\u0131rlatmadan \u00f6nce <code>null<\/code> kontrol\u00fc yap\u0131n (<code>EventName?.Invoke(...)<\/code>).<br \/>\n*   Olay i\u015fleyicilerinde uzun s\u00fcreli veya bloke edici i\u015flemler yapmaktan ka\u00e7\u0131n\u0131n, \u00e7\u00fcnk\u00fc bu yay\u0131nc\u0131y\u0131 kilitleyebilir.<br \/>\n*   Abonelikten \u00e7\u0131kmay\u0131 unutmay\u0131n, \u00f6zellikle uzun \u00f6m\u00fcrl\u00fc nesnelerde bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in.<\/p>\n<h3>Delegates ve Events Aras\u0131ndaki Farklar<\/h3>\n<p>Delegates ve Events birbirine s\u0131k\u0131ca ba\u011fl\u0131 kavramlar olsa da, kullan\u0131m ama\u00e7lar\u0131 ve sunduklar\u0131 g\u00fcvenlik\/kaps\u00fclleme a\u00e7\u0131s\u0131ndan \u00f6nemli farklara sahiptirler. Bu farklar\u0131 anlamak, do\u011fru senaryoda do\u011fru yap\u0131y\u0131 kullanmak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>Eri\u015fim K\u0131s\u0131tlamalar\u0131<\/h4>\n<p>*   <strong>Delegates:<\/strong> Bir delegate nesnesi, tan\u0131mland\u0131\u011f\u0131 yerden ve eri\u015fim belirleyicisine g\u00f6re herhangi bir yerden do\u011frudan \u00e7a\u011fr\u0131labilir. Bu, delegate'in referans\u0131n\u0131 tutan herkesin delegate'i tetikleyebilece\u011fi anlam\u0131na gelir.<br \/>\n*   <strong>Events:<\/strong> Bir <code>event<\/code> anahtar kelimesiyle tan\u0131mland\u0131\u011f\u0131nda, olay sadece tan\u0131mland\u0131\u011f\u0131 s\u0131n\u0131f\u0131n i\u00e7inden f\u0131rlat\u0131labilir. D\u0131\u015far\u0131dan sadece <code>+=<\/code> ve <code>-=<\/code> operat\u00f6rleri ile abone olunabilir veya abonelikten \u00e7\u0131k\u0131labilir. Do\u011frudan <code>event()<\/code> \u015feklinde \u00e7a\u011f\u0131rmak m\u00fcmk\u00fcn de\u011fildir. Bu, olaylar\u0131n d\u0131\u015far\u0131dan k\u00f6t\u00fcye kullan\u0131lmas\u0131n\u0131 veya yanl\u0131\u015fl\u0131kla tetiklenmesini engeller.<\/p>\n<h4>Kullan\u0131m Ama\u00e7lar\u0131<\/h4>\n<p>*   <strong>Delegates:<\/strong> Daha genel ama\u00e7l\u0131d\u0131r. Callback mekanizmalar\u0131, metotlar\u0131 parametre olarak ge\u00e7irme, LINQ sorgular\u0131nda veya ThreadPool gibi yap\u0131larda metotlar\u0131 temsil etme gibi geni\u015f bir yelpazede kullan\u0131l\u0131r.<br \/>\n*   <strong>Events:<\/strong> \u00d6zellikle Publisher-Subscriber deseni i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bir nesnenin durum de\u011fi\u015fikli\u011fini veya bir eylemi di\u011fer nesnelere g\u00fcvenli ve kaps\u00fcllenmi\u015f bir \u015fekilde bildirmesi gerekti\u011finde kullan\u0131l\u0131r.<\/p>\n<h4>G\u00fcvenlik ve Kaps\u00fclleme<\/h4>\n<p>A\u015fa\u011f\u0131daki tablo, Delegates ve Events aras\u0131ndaki temel farklar\u0131 \u00f6zetlemektedir:<\/p>\n<table class=\"table table-bordered\">\n<thead>\n<tr>\n<th>\u00d6zellik<\/th>\n<th>Delegate<\/th>\n<th>Event<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Tan\u0131m<\/strong><\/td>\n<td>Metotlara referans tutan tip g\u00fcvenli i\u015faret\u00e7i.<\/td>\n<td>\u00d6zel bir delegate t\u00fcr\u00fc, <code>event<\/code> anahtar kelimesiyle tan\u0131mlan\u0131r.<\/td>\n<\/tr>\n<tr>\n<td><strong>\u00c7a\u011f\u0131rma<\/strong><\/td>\n<td>Herhangi bir yerden do\u011frudan \u00e7a\u011fr\u0131labilir (eri\u015fim belirleyiciye g\u00f6re).<\/td>\n<td>Sadece tan\u0131mland\u0131\u011f\u0131 s\u0131n\u0131f\u0131n i\u00e7inden f\u0131rlat\u0131labilir.<\/td>\n<\/tr>\n<tr>\n<td><strong>Abonelik\/\u0130ptal<\/strong><\/td>\n<td><code>=<\/code>, <code>+=<\/code>, <code>-=<\/code> operat\u00f6rleri ile referans atama ve zincirleme.<\/td>\n<td>Sadece <code>+=<\/code> (abone olma) ve <code>-=<\/code> (abonelikten \u00e7\u0131kma) operat\u00f6rleri ile.<\/td>\n<\/tr>\n<tr>\n<td><strong>Kaps\u00fclleme<\/strong><\/td>\n<td>D\u00fc\u015f\u00fck kaps\u00fclleme, referans\u0131 olan herkes metotlar\u0131 \u00e7a\u011f\u0131rabilir.<\/td>\n<td>Y\u00fcksek kaps\u00fclleme, sadece yay\u0131nc\u0131 olay\u0131 f\u0131rlatabilir.<\/td>\n<\/tr>\n<tr>\n<td><strong>Ama\u00e7<\/strong><\/td>\n<td>Callback'ler, dinamik metot \u00e7a\u011f\u0131rma, LINQ, Threading.<\/td>\n<td>Olay tabanl\u0131 programlama, Publisher-Subscriber deseni.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u00d6zetle, bir delegate, bir metot i\u015faret\u00e7isi iken; bir event, bu metot i\u015faret\u00e7isinin (delegate'in) g\u00fcvenli ve kontroll\u00fc bir \u015fekilde d\u0131\u015far\u0131ya a\u00e7\u0131lan bir aray\u00fcz\u00fcd\u00fcr. Event'ler, delegate'ler \u00fczerine in\u015fa edilmi\u015f daha y\u00fcksek seviyeli bir soyutlamad\u0131r.<\/p>\n<h3>Anonim Metotlar, Lambda \u0130fadeleri ve Events<\/h3>\n<p>Modern C# s\u00fcr\u00fcmleri, anonim metotlar ve \u00f6zellikle lambda ifadeleri sayesinde delegate ve event kullan\u0131m\u0131n\u0131 daha da basitle\u015ftirmi\u015f ve okunabilir hale getirmi\u015ftir. Bu yap\u0131lar, k\u0131sa s\u00fcreli veya tek kullan\u0131ml\u0131k delegate'ler ve event i\u015fleyicileri tan\u0131mlamak i\u00e7in idealdir.<\/p>\n<h4>Anonim Metotlarla Event Aboneli\u011fi<\/h4>\n<p>C# 2.0 ile tan\u0131t\u0131lan anonim metotlar, isimsiz metot bloklar\u0131 olu\u015fturarak delegate'leri daha kolay tan\u0131mlamam\u0131z\u0131 sa\u011flad\u0131. \u00d6zellikle olay i\u015fleyicileri i\u00e7in, ayr\u0131 bir metot tan\u0131mlamak yerine do\u011frudan abone olurken kodu yazmaya olanak tan\u0131d\u0131.<\/p>\n<pre><code class=\"language-csharp\">\npublic class Timer\n{\n    public event EventHandler Tick;\n    public void Start()\n    {\n        Console.WriteLine(\"Timer ba\u015flad\u0131.\");\n        Tick?.Invoke(this, EventArgs.Empty);\n    }\n}\n\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        Timer timer = new Timer();\n\n        \/\/ Anonim metot ile event'e abone olma\n        timer.Tick += delegate(object sender, EventArgs e)\n        {\n            Console.WriteLine(\"Anonim metot: Zamanlay\u0131c\u0131 t\u0131kland\u0131!\");\n        };\n\n        timer.Start();\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Lambda \u0130fadelerinin G\u00fcc\u00fc<\/h4>\n<p>C# 3.0 ile gelen lambda ifadeleri, anonim metotlar\u0131n daha k\u0131sa ve daha g\u00fc\u00e7l\u00fc bir versiyonudur. \u00d6zellikle LINQ sorgular\u0131nda yayg\u0131n olarak kullan\u0131lmalar\u0131n\u0131n yan\u0131 s\u0131ra, event aboneliklerinde de olduk\u00e7a pop\u00fclerdirler.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ \u00d6nceki Timer \u00f6rne\u011fi \u00fczerinden devam edelim\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        Timer timer = new Timer();\n\n        \/\/ Lambda ifadesi ile event'e abone olma\n        timer.Tick += (sender, e) =>\n        {\n            Console.WriteLine(\"Lambda: Zamanlay\u0131c\u0131 t\u0131kland\u0131!\");\n            Console.WriteLine($\"Olay\u0131 f\u0131rlatan: {sender.GetType().Name}\");\n        };\n\n        timer.Start();\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Lambda ifadeleri, \u00f6zellikle tek sat\u0131rl\u0131k veya k\u0131sa kod bloklar\u0131na sahip olay i\u015fleyicileri i\u00e7in kodun okunabilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Parametre tipleri genellikle derleyici taraf\u0131ndan \u00e7\u0131kar\u0131labilir, bu da kodu daha da k\u0131salt\u0131r.<\/p>\n<h4>Modern C# Yakla\u015f\u0131mlar\u0131<\/h4>\n<p>Modern C# geli\u015ftirme s\u00fcre\u00e7lerinde, olay aboneliklerinde genellikle lambda ifadeleri tercih edilir. Bu, kodun daha temiz, daha \u00f6zl\u00fc ve daha i\u015flevsel olmas\u0131n\u0131 sa\u011flar. \u00d6zellikle <code>async<\/code>\/<code>await<\/code> ile birlikte kullan\u0131ld\u0131\u011f\u0131nda, asenkron olay i\u015fleyicilerini tan\u0131mlamak da olduk\u00e7a kolayla\u015f\u0131r.<\/p>\n<p>Ancak, bir lambda ifadesi veya anonim metot ile abone olundu\u011funda, abonelikten \u00e7\u0131kmak i\u00e7in ayn\u0131 referans\u0131 kullanmak gerekir. E\u011fer lambda ifadesi do\u011frudan <code>+=<\/code> i\u00e7inde tan\u0131mlan\u0131yorsa, ayn\u0131 lambda ifadesini <code>-=<\/code> ile kullanmak m\u00fcmk\u00fcn olmayabilir, \u00e7\u00fcnk\u00fc her lambda ifadesi derlendi\u011finde farkl\u0131 bir anonim metot nesnesi olu\u015fturulur. Bu durumda, lambda ifadesini bir de\u011fi\u015fkene atay\u0131p o de\u011fi\u015fken \u00fczerinden abone olmak ve abonelikten \u00e7\u0131kmak en g\u00fcvenli yoldur.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Lambda ifadesini bir de\u011fi\u015fkene atayarak abonelikten \u00e7\u0131kma\nEventHandler handler = (sender, e) => Console.WriteLine(\"Abonelikten \u00e7\u0131k\u0131labilen lambda!\");\ntimer.Tick += handler;\ntimer.Start();\ntimer.Tick -= handler; \/\/ \u015eimdi abonelikten \u00e7\u0131k\u0131labilir\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek ve olay aboneliklerini do\u011fru bir \u015fekilde y\u00f6netmek i\u00e7in \u00f6nemlidir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>C# Delegates ve Events, modern ve esnek uygulamalar geli\u015ftirmek i\u00e7in vazge\u00e7ilmez yap\u0131 ta\u015flar\u0131d\u0131r. Delegates, metotlara referans tutarak dinamik kod y\u00fcr\u00fctme ve callback mekanizmalar\u0131 sa\u011flarken, Events bu delegate'ler \u00fczerine in\u015fa edilmi\u015f, Publisher-Subscriber desenini uygulayan g\u00fcvenli ve kaps\u00fcllenmi\u015f bir olay i\u015fleme mekanizmas\u0131 sunar. Bu iki kavram\u0131n do\u011fru anla\u015f\u0131lmas\u0131 ve etkin bir \u015fekilde kullan\u0131lmas\u0131, daha mod\u00fcler, bak\u0131m\u0131 kolay ve geni\u015fletilebilir C# uygulamalar\u0131 yazman\u0131n anahtar\u0131d\u0131r. Anonim metotlar ve lambda ifadeleri gibi modern C# \u00f6zellikleri ise bu yap\u0131lar\u0131n kullan\u0131m\u0131n\u0131 daha da kolayla\u015ft\u0131rarak geli\u015ftirici verimlili\u011fini art\u0131rmaktad\u0131r.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>1. Delegate nedir ve ne i\u015fe yarar?<\/h4>\n<p>Delegate, C# dilinde metotlara referans tutabilen, tip g\u00fcvenli bir i\u015faret\u00e7i g\u00f6revi g\u00f6ren \u00f6zel bir veri tipidir. Bir metodu bir de\u011fi\u015fken gibi atayabilir, parametre olarak ge\u00e7irebilir veya bir koleksiyonda saklayabilirsiniz. Callback mekanizmalar\u0131, olay i\u015fleme ve \u00e7oklu yay\u0131n (multicast) senaryolar\u0131nda kullan\u0131l\u0131r.<\/p>\n<h4>2. Events neden Delegates \u00fczerine in\u015fa edilmi\u015ftir?<\/h4>\n<p>Events, asl\u0131nda \u00f6zel bir delegate t\u00fcr\u00fcd\u00fcr. Delegate'ler, metot referanslar\u0131n\u0131 tutma ve \u00e7a\u011f\u0131rma yetene\u011fi sa\u011flar. Events, bu delegate mekanizmas\u0131n\u0131 kullanarak, yay\u0131nc\u0131 ve abone aras\u0131nda kontroll\u00fc ve kaps\u00fcllenmi\u015f bir ileti\u015fim kanal\u0131 olu\u015fturur. <code>event<\/code> anahtar kelimesi, delegate'in d\u0131\u015far\u0131dan do\u011frudan \u00e7a\u011fr\u0131lmas\u0131n\u0131 engelleyerek g\u00fcvenli\u011fi art\u0131r\u0131r.<\/p>\n<h4>3. Bir event'i nas\u0131l f\u0131rlat\u0131r\u0131m (raise ederim)?<\/h4>\n<p>Bir event, sadece tan\u0131mland\u0131\u011f\u0131 s\u0131n\u0131f\u0131n i\u00e7inden f\u0131rlat\u0131labilir. Genellikle <code>On[EventAd\u0131]<\/code> \u015feklinde adland\u0131r\u0131lan <code>protected virtual<\/code> bir metot i\u00e7inde, event delegate'i <code>null<\/code> kontrol\u00fc yap\u0131larak \u00e7a\u011fr\u0131l\u0131r: <code>MyEvent?.Invoke(this, e);<\/code>.<\/p>\n<h4>4. <code>EventHandler<\/code> ve <code>EventHandler<TEventArgs><\/code> aras\u0131ndaki fark nedir?<\/h4>\n<p>`<\/p>\n","protected":false},"excerpt":{"rendered":"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc\nC# programlama dilinde esnek ve geni\u015fletilebilir uygulamalar geli\u015ftirmek i\u00e7in Delegates (Tem&#8230;","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-39249","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>C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc\" \/>\n<meta property=\"og:description\" content=\"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc C# programlama dilinde esnek ve geni\u015fletilebilir uygulamalar geli\u015ftirmek i\u00e7in Delegates (Tem...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-17T11:30:45+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=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc\",\"datePublished\":\"2026-02-17T11:30:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/\"},\"wordCount\":2623,\"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\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/\",\"name\":\"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-17T11:30:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc\"}]},{\"@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":"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/","og_locale":"tr_TR","og_type":"article","og_title":"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc","og_description":"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc C# programlama dilinde esnek ve geni\u015fletilebilir uygulamalar geli\u015ftirmek i\u00e7in Delegates (Tem...","og_url":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-17T11:30:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc","datePublished":"2026-02-17T11:30:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/"},"wordCount":2623,"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\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/","url":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/","name":"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-17T11:30:45+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/c-delegates-ve-events-olay-tabanli-programlamanin-gucu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"C# Delegates ve Events: Olay Tabanl\u0131 Programlaman\u0131n G\u00fcc\u00fc"}]},{"@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\/39249","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=39249"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39249\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}