C# Eventleri



Merhaba, bu yazımda sizlere C#'ın en sevdiğim özelliklerinden biri olan eventleri yani Türkçe ismiyle 'etkinlikler'i anlatacağım. Peki ne demektir bu etkinlikler?

Etkinlikler

Basitçe anlatmak gerekirse etkinlikler, sınıfınızın yaptığı bir eylemi sınıfınızı kullanan diğer sınıflar ile entegreli yapmasını sağlar. Örnekle daha iyi anlatabilirim sanırım.

Örneğe geçmeden önce etkinlikleri belki de nerede bilmeden kullandığınızı göstereyim önce. Bir form uygulamanız var diyelim, butona tıklandığı zaman mesaj kutusu çıkarmanız gereksin. Bunun için muhtemelen butona çift tıklayıp bir metod oluşturttunuz, aslında bu bir etkinlik. Designer.cs dosyasını incelerseniz butonunuza += operatörü ile oluşan metodun eklendiğini görebilirsiniz. Aşağıdaki örnekte bir RichTextBox kontrolüne eklenen Click metodunu verdim.



Artık örneğe geçebiliriz. Bir sınıf yazdınız, bu sınıf en basitinden bir sayı toplatma sınıfı olsun. Sayıları topladığınız zaman bunu kullanıcının bilmesi için form ekranına yazdırmanız gerekecek. Belki de şu ana kadar sınıfın içinden direkt olarak forma erişip yapıyordunuz bu işlemi. Yani şu şekilde:

C#:
//Matematik.cs

class Matematik{
    public void Toplat(int s1, int s2){
        int sayi = s1 + s2;
        AnaForm.form.lblDurum.Text = sayi.ToString();
    }
}

//AnaForm.cs

partial class AnaForm : Form{
    public static AnaForm form;
    public AnaForm(){
        InitializeComponent();
        form = this;
    }
}

Fakat burada şöyle bir sorun var, bu sınıfı başka projelerde de kullanmak veya başka formlarda da kullanmak isterseniz ne olacak? İçinizden sayı döndüren bir metoda çevirmek gelebilir ve haklısınız, bu daha kolay olacaktır. Başka bir örnek vereyim, asenkron bir metodunuz var. Yani ne zaman sonuç döndüreceğini bilmiyorsunuz. Bu soket programlamada TCP protokolünü kullanırken olabilir. Karşı taraftan ne zaman mesaj geleceğini bilemezsiniz. Bunu da döngü açarak kontrol etmek saçma olacaktır.
Artık etkinlikleri kullanma nedenimizi anladınız sanırım.

Delegate Tipi​

Türkçesi temsilci, bunu baştan belirteyim. Adı üstünde bir şeyleri temsil ediyor bu arkadaş, temsil ettiği şey ise metodlar. Temsil etmesi sayesinde ise metodları değişkene atayabiliyorsunuz. Çok uzatmadan türleriyle başlamak istiyorum. Temsilcilerin iki türü vardır: Action ve Function. Action, değer döndürmeyen; Function, değer döndüren tipidir. İkisi de maksimum 16 giriş parametresi alabilir. Oluşturduğunuz metodları Invoke() ile çağırabilirsiniz.

C#:
static void Topla(int a, int b){
    Console.WriteLine(a + b);
}

static void Main(string[] args){
    Action<int, int> toplat = new Action<int, int>(Topla); // <> içinde belirttiğimiz metodun hangi parametre türlerini aldığıdır.
    toplat.Invoke(20, 30); // Metodumuzu çalıştırdık.
}

C#:
static int Toplat(double a, double b){
    return (int)(a + b);
}

static void Main(string[] args){
    Func<double, double, int> toplat = new Func<double, double, int>(Toplat); // İlkleri çıkış, diğerleri giriş parametresidir.
    Console.WriteLine(toplat.Invoke(10.5, 13.5));
    // Sonuç 24
}

Kendi temsilcinizi de oluşturabilirsiniz.

C#:
public delegate string Temsilci(string d1, string d2);
// Aynı metod oluşturur gibi temsilcimizi oluşturduk.

static void Main(string[] args){
    Temsilci temsilci = new Temsilci((d1, d2) => d1 + " " + d2); // Temsilciyi oluştururken tek satırlık metod ile gelen iki string parametreyi birleştirdik.

    Console.WriteLine(temsilci("abc", "cba"));
}

Tek Satırda Metodlar​

Etkinlikleri kullanmadan önce bilmeniz gereken bir başka şey de bu aslında. Bunu bilmezseniz bir satırlık yapacağınız işlem için ayrı bir metod oluşturacaksınız ve bu da kod kirliliğine sebep olacak. Bu metodları istediğiniz her yerde kullanabilirsiniz.

Genel olarak söz dizimleri lambda fonksiyonlarına benzerdir. Lambda fonksiyonlarına ait bir yazım var, inceleyebilirsiniz.
(parametreler) => işlem

C#:
static void Main(string[] args){
    Action metod = () => Console.WriteLine("Merhaba Dünya!"); // Parametre almadan bir fonksiyon.
    Action<string> metod2 = (a) => Console.WriteLine(a); // Parametre alarak bir fonksiyon.
  
    metod.Invoke();
    metod2.Invoke("Deneme");
  
    Func<int> metod3 = () => 30; // 30 döndüren bir fonksiyon.
    metod2.Invoke(metod3.Invoke().ToString());
  
    // Not: Tabii ki sadece Invoke ile çağırmıyoruz, direkt () ile çağırabiliriz.
    metod2("Deneme2");
}

Şimdi gelelim fasulyenin faydalarına, etkinliklere geçebiliriz.

Genel Söz Dizimi​

Etkinlikleri kullanmak için bir temsilcimizin olması gerekiyor. Bu temsilciyi etkinliğe atayacağız. Unutmayın ki etkinlikleri static sınıf ve metodlarda kullanamazsınız.

C#:
public class Program{
    static void Main(string[] args){
        Sinifim s = new Sinifim();
        s.Eventim += (toplam) => Console.WriteLine(toplam);
        s.Toplat(30, 40);
      
        //Çıktı: 70
    }
}

public class Sinifim{
    public event Action<int> Eventim; // Değişken tanımlar gibi fakat başında event var.
    public void Toplat(int a, int b){
        int toplam = a + b;
        Eventim?.Invoke(toplam);
        // ? operatörü Eventim null ise çalıştırma anlamına geliyor.
        // Bu da etkinliğe değer ataması yapılmadığı zaman işimize yarıyor.
    }
}

Ek olarak bir etkinliğe birden fazla metod eklenebileceğini de belirteyim.

Süslü parantez açarak da çok satırlı metodlarınızı tek satırlık metod yöntemiyle yazabilirsiniz.

Böylece artık etkinlikleri nasıl kullanacağınızı biliyorsunuz, aklınıza takılan tüm soruları sorabilirsiniz.

İyi forumlar.

Yorumlar

Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…