Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Aytaç Özay
Aytaç Özay
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
4 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C# / VC#/.NET Aytaç Özay
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 6.10.2003
Okunma Sayısı : 117400
Yorum Sayısı : 10     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 29.3.2024
Turhal Temizer
Mac OS/X Removing CUDA 29.3.2024
Burak Selim Şenyurt
Kurumsal Yazılımcının Oyun Geliştirme ile İmtihanı 29.3.2024
Burak Selim Şenyurt
Matematik ve Oyun Programlama - Missile Command - Final 29.3.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
C#’ta Temsilci (Delegate)ve Olay(Event) Kullanımı
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Bu yazımda sizlere C#’ta delegate(delege veya elçi) ve event(olay) kavramlarından bahsedeceğim ve elbette bunları kullanmanın yararlarını anlatacağım. Kuşkusuz .Net Framework ile birlikte gelen en büyük yeniliklerden biri delege ve event kullanımıdır. Bu yanı ile .Net Framework diğer uygulama geliştirme ortamlarının bir kısmından daha üstün niteliklere sahip olmaktadır. Şimdi delege nedir biraz ondan bahsedelim. Delege basit anlamda düşünürsek aracılık yapandır. Burada ise delege aracılık yapan metod olarak karşımıza çıkar. Yani başka bir metodun tetiklenmesine yardım eden metottur. Bu sayede metodların tetiklenmesi dinamik olarak gerçekleşir. Olay(event) ise her zaman –belki farkında olmadan– kullandığımız kontroller gibidir. Yalnız delege ile olay arasındaki fark delegelerin "invoke" edilmesi olayların ise "raise" edilmesidir. Daha basit olarak ifade edersek olaylar delegelerin özel bir halidir. Delegeler olmadan olayların bir anlamı yoktur. Aslında bir örnekle bunların nasıl kullanıldığını açıklarsam daha iyi anlaşılacaktır. Şimdi çayın kaynamasını düşünün. Çay kaynadığı anda haberdar olmak istiyoruz ancak çayın başında da beklemek istemiyoruz. Bu yüzden bizi haberdar edecek zil çalma metodunu çayın kaynama metoduna bağlıyoruz. Ve çay kaynadığı anda zil çalma metodu da otomatik olarak tetiklenmiş oluyor. Delege ile olayın implementasyonunu aşağıda göstereceğim ve bunlarla ilgili bir program de koyarak anlaşılmasını kolaylaştıracağım. Çünkü bazen programlarla anlatmak istediklerimizi daha iyi anlatırız.

I.   Olayın(event) yapılışı: Mouse’ın tıklanması, form üzerindeki bir tuşa basılması, form üzerindeki bir linkin tıklanması vs… bunların hepsi birer olaydır aslında. Şimdi mouse tıklanması ile ilgili bir kodu inceleyelim:

private void FareTikla()

    // Buraya mouse’un sol tıklanması durumunda yapılması gereken 

    // işlemler gelecek.
}

// Burada fareye sol tıklandığı zaman çalışacak olan metodu bağlıyoruz. Bu işlemi de doğal olarak delegelerle yapıyoruz. Buradaki '+=' operatörüne dikkat ettiniz mi? Bu '+=' operatörü fareye sol tıklanması olayı karşısında raise edilecek eventi bağlamamıza yarıyor.

Mouse.MouseClicked += new MouseClickedEventHandler(FareTikla);

// Şimdi de fare sol tıklandığı zaman çalışacak olan metodu devreden çıkarıyoruz. Bu sayede fare sol tıklandığı zaman hiç bir metot //devreye girmeyecektir. Yani farenin sol tıklanmasına herhangi bir tepki verilmeyecektir.

Mouse.MouseClicked -= new MouseClickedEventHandler(FareTikla);


II.    Delegenin yapılışı: Delege kullanılacağı zaman tek başına da kullanılabildiği gibi olaylara bağlanarak da kullanılabilmektedir. Bu yüzden  ilk önce olayı(event) anlarsak delegenin anlaşılması daha da kolaylaşacaktır. Şimdi basit bir delege nasıl tanımlanır ona bakalım.

// Tanımladığımız delege double tipinde parametre alıyor

// ve int tipinde değer döndürüyor.

public delegate int myDelegate(double D);

// Delegenin temsil edeceği metodu yazalım.

public int ReturnInt(double D)

{   

//Buraya metod çalışınca yapılması gerekecek olan kod gelecek

}

// Şimdi de delegenin bir örneğini yaratalım.

public void amethod(


myDelegate aDelegate = new myDelegate(ReturnInt);

}

//Şimdi de delegenin temsil ettiği metodun nasıl çalıştırılacağını sağlayan kodu yazalım.

aDelegate(3333);

Şimdi bu delege ve olay yapısı bizim ne işimize yarayacak derseniz; Şöyle bir senaryo üretelim: Birden fazla formda aynı anda çalıştığımızı ve bu formların da birbirinin aynı olduğunu düşünelim(şekilsel olarak tabii ki) ve bu formlardan herhangi birinin üzerindeki bir tuşa basıldığı zaman bütün formlarda hangi formun tıklandığına dair bir yazı yazmasını isteyelim.

Bunu eğer uzun yoldan yapmak isterseniz tek tek bütün formlar içinde birer tane değişken tanımlayıp onu kontrol etmeniz gerekirdi. Sonra da tek tek diğer formlara mesaj gönderilmesini sağlamak gerekirdi. Bu şekilde yapmak uzun ve zahmetli bir iş olurdu.

İkinci yöntem ise delege(temsilci) yapısını kullanmaktır. Şimdi her formumuz için bir tane forma mesaj yazacak olan bir metod olmalı ve bu metod hangi formdaki yazdırma tuşunun tetiklendiğini belirtmek için bir tane de parametre almalı. Şimdi de yukarıda anlattığımız senaryonun kodunu inceleyelim.

Ana formumuz içinde tanımladığımız delege ve olay yapısına bakalım. Burada delegemiz tamsayı(int) bir parametre alıyor. Bu parametre sayesinde hangi formdaki tuşa basılarak bu delegenin harekete geçirildiğini anlayabileceğiz. Olayımıza bakacak olursak olayımızın bir üst satırda tanımlanan delege tipinde olduğunu görebiliriz.

sayac değişkeni ise forma numara vermek için tanımlanmış bir değişken oluyor.

private int sayac = 0;

public delegate void userDelegate(int formNo);

public event userDelegate userEvent;

Yeni form oluşturma tuşuna basılınca ise yeni form oluşturulacak ve bu formun içindeki etikete yazma metodu olaya eklenecek.

sayac = sayac+1;       

FrmUser frmUser=new FrmUser(sayac,this);

this.userEvent += new userDelegate(frmUser.writeFormNo);

Olaylara doğrudan başka sınıflar altından erişilebilse de bu yöntem pek doğru bir yol olmayacağı için olayımızı bir metodun içinde kamufle ederek kullanıyoruz. O yüzden olayımızı metodTetikle adında bir metodun içinde kamufle ederek kullanıyoruz. Başka bir formdan içinden bu metod çağrıldığı an otomatik olarak olayımızı tetikleyip bütün formlara(ana formumuz hariç) hangi formdan tuşa baıldığını yazacak.

public void metodTetikle(int formNo)
{
userEvent(formNo);
}

Bir de şimdi olaydan belli bir delegenin çıkarılması işlemi var değil mi? Öyle ya yaratılan formlardan bir tanesi kapatılırsa yazdırma metodunun tetiklenmesi istisna’ya (exception) yol açar. Bu yüzden bu formun metodunun listeden çıkarılması gerekir. Aşağıdaki kod bu işi yaparak bizi istenmeyen hatalardan korumuş olur.

public void elemanCikart(FrmUser frmUser)
{
this.userEvent -= new userDelegate(frmUser.writeFormNo);
}

Yukarıdaki kodun tamamı ana formumuz içinde yer alan kodlardı. Şimdi de ana formda tuşa basılınca oluşturulan formun içinde koda bakalım.

Formlara yazı yazdırmak için tuşa bastığımızda ana formumuzdaki metodTetikle metodunu çağırarak olayın tetiklenmesini sağlıyoruz.

private void btnActive_Click(object sender, System.EventArgs e)

{

form1.metodTetikle(formNo);

}

Ancak her formun içinde forma mesajı yazacak olan kısım aşağıdaki metoddakigibidir. Şimdi diyeceksiniz, niye aynı form içindeki metodu başka bir formu kullanarak çağırıyorsunuz. Ama buradaki fark ekrana mesaj yazacak olan form sayısının bir tane olmamasıdır. N tane forma aynı anda mesaj yazdırmak istediğimiz için bir başka sınıfta veya formda tanımlanmış olan bir olayı tetikleyerek bu işi yapıyoruz. Aksi halde N tane formu tek tek dolaşmamız gerekirdi. Bu ise performans kaybına yol açtığı gibi daha büyük programlarda kod karmaşasına yol açabilmektedir.  

public void writeFormNo(int tetiklenenNo)
{
lblAciklama.Text="Tuşa Basılan Form Numarası:"+tetiklenenNo;
}

Galiba bir tek sonradan oluşturulmuş bir form kapatılınca ana formumuzdaki delege çıkartma metodunun nasıl çağrılacağı kaldı. Onu da sonradan oluşturulan formumuzun Dispose metodu içine aşağıdaki gibi yazarsak hiç bir şekilde hatayla karşılaşmayız.

form1.elemanCikart(this);

Evet yukarıda delege ve olayın nasıl bir arada kullanıldığını basit bir örnek üzerinde anlatmış oldum. Yukarıda delege ve olayın bir arada kullanıldığı örnek programı   buraya tıklayarak indirebilirsiniz.

Son olarak iyi anlayamadığınız veya kafanıza takılan kısımlar için mail adresim [email protected] 

Aytaç ÖZAY

Ege Üniversitesi

Bilgisayar Mühendisliği

 

Makale:
C#’ta Temsilci (Delegate)ve Olay(Event) Kullanımı C#, Visual C# ve .NET Aytaç Özay
  • Yazılan Yorumlar
  • Yorum Yaz
KAS
12
2018
burayada bir göz atabilirsiniz https://code.replyfeed.com/sorular/151/c-sharp-delegate-kullanimi
ARA
4
2015
anlatım şekli biraz karışık olabilir ama çok ince noktalara değinmişsiniz teşekkürler.bu konu hakkında biraz daha bilgi sahibi oldum
ARA
4
2015
anlatım şekli biraz karışık olabilir ama çok ince noktalara değinmişsiniz teşekkürler.bu konu hakkında biraz daha bilgi sahibi oldum
ŞUB
2
2013
Nesini anlamadınız arkadaşlar ya :D
ARA
15
2011
Zannedersem makalenin yazılmasından 7 sene yorum yapan arkadaşlar IT sektöründe çalışmıyor olsa gerekler ki bu sektörde yazılan birşeyin sonsuza kadar anlaşılır olmasını bekliyorlar. Elbette ki 2003 yılında yazılan bir makale ile daha sonra yazılan bir makaleyi karşılaştırdığınızda yeni yazılanlar daha anlaşılır olacaktır. Çünkü bir çıta koyuyorsunuz geriden gelenler o çıtanın üzerine çıkıyorlar. IT sektöründe çalışıyorsanız her zaman bu böyle olacaktır. Saygılar,
HAZ
27
2010
gerçekten çok kötü bir anlatım, kodlar dağınık. anlaşılır bir şey yok bence kaldırılması gereken bir makale.
NİS
13
2010
Hıc anlaşılır olmamıs kusura bakmayın burak selım hocanın makalesını okumnanızı onerırım
NİS
13
2010
Hıc anlaşılır olmamıs kusura bakmayın burak selım hocanın makalesını okumnanızı onerırım
NİS
13
2010
Hıc anlaşılır olmamıs kusura bakmayın burak selım hocanın makalesını okumnanızı onerırım
MAR
23
2005
Cok guzel olmus ellerine saglik. www.gurbetteyim.com
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor