Bir önceki makalede olay tabanlı programlamanın nasıl yapıldığından detaylı bir biçimde bahsetmiştim. Şimdi de event kullanımını inceleyeceğiz. Eventleri, delegelerin kapsüllenmiş hali olarak düşünebiliriz. Nasıl ki field’lar private bırakılarak, property’ler yardımı ile dışarı açılıyorsa, ya da bir ArrayList arka tarafta bir object dizini kapsüllüyorsa, aynı mantık ile, bir event de bir delegeyi kapsülleyerek encapsulation felsefesine uygun bir kullanım sağlamaktadır. Kullanım amacı ve yapılan işlemler aynıdır. Hatta event kullanmak işimizi daha da kolaylaştırır.
Event’leri özellikle windows ve web tarafında sıkça kullanırız. Bir windows uygulamasına sürüklenen buton üzerine çift tıklandığında , kod tarafında bizim için bir metot oluşturulur ve içini doldurmamız beklenir.Metodun içerisine de butona tıklandığında gerçekleşmesini istediğimiz işlemi kodlarız. Aslında yapılan işlem, Buton sınıfı içerisinde tanımlanmış Click event’ine, bizim yazmış olduğumuzun metodun bağlanması işlemidir. Butona tıklandığında da, yazdığımız metot tetiklenir ve yapılmasını istediğimiz iş gerçekleşir.
Buton üzerine sağ tuş tıklayıp “properties” penceresini açalım. Açılan penceredeki şimşek ikonuna tıkladığımız takdirde, buton sınıfı içerisinde tanımlanmış event’leri göreceğiz.
Buton üzerine veya Click yazısı üzerine çift tıkladığımız takdirde kod tarafına yönlendiriliriz.
Form’un designer’ına baktığımızda button1_Click metodunun, Click event’ine “ += ” operatörü ile bağlandığını görürüz.
Kullanımını anlamak için Olay tabanlı programlamayı anlatırken yaptığımız örnek üzerinden devam edelim. Urun adında bir sınıf olsun ve bu sınıfa ait bir nesne örneğinin fiyatı değiştiğinde bunu haber almamızı sağlayan bir mekanizma tasarlayalım. Ayrıca eski ve yeni fiyat bilgilerini de görmek istediğimizi düşünelim.
public delegate void UrunHandler(double eskiFiyat, double yeniFiyat, Urun urn);
public class Urun
{
int _id;
string _ad;
double _fiyat;
public event UrunHandler fiyatDegisti;
public int Id
{
get { return _id; }
set { _id = value; }
}
public string Ad
{
get { return _ad; }
set { _ad = value; }
}
public double Fiyat
{
get { return _fiyat; }
set
{
double eskiFiyat = _fiyat; // Varolan fiyatı alarak, eski fiyat bilgisini tutuyoruz.
_fiyat = value; // yeni atanan değer.
if (fiyatDegisti != null)
{
fiyatDegisti.Invoke(eskiFiyat, value, this);
}
}
}
public Urun(int id, string ad, double fiyat)
{
Id = id;
Ad = ad;
Fiyat = fiyat;
}
}
Bir önceki örnekte delegeyi manuel olarak kapsüllemiştik. Ancak event kullandığımızda bu işleme gerek kalmaz, zaten event’in yaptığı da tam olarak budur.
Program tarafında gerekli testi yapalım.
class Program
{
static void Main(string[] args)
{
Urun urn = new Urun(1, "Monitör", 200);
urn.fiyatDegisti += new UrunHandler(FiyatDegisti);
urn.Fiyat = 350;
urn.Fiyat = 120;
}
static void FiyatDegisti(double eskiFiyat, double yeniFiyat, Urun urun)
{
if (eskiFiyat > yeniFiyat)
{
Console.WriteLine("'{0}' adlı ürün indirime girdi. Eski fiyat:{1} => Yeni fiyat:{2}", urun.Ad, eskiFiyat, yeniFiyat);
}
if (yeniFiyat > eskiFiyat)
{
Console.WriteLine("'{0}' adlı ürüne zam geldi. Eski fiyat:{1} => Yeni fiyat:{2}", urun.Ad, eskiFiyat, yeniFiyat);
}
}
}
Ekran çıktısı aşağıdaki gibi olacaktır.
2 yorum:
Çok teşekkürler, Onur Bey.
Ellerinize sağlık çok teşekkür ederim. Bana çok faydası oldu. Umarım inceleyen arkadaşlarımıza da faydası olur.
Yorum Gönder