Bu site emekli olmuştur. Arşiv amaçlı olarak
BT AKADEMİ
sponsorluğunda yayın hayatına devam etmektedir.
Ana Sayfa
.net TV
Makaleler
Kaynak Kod
Haberler
Serbest Köşe
Canlı Köşe
Forum
C#nedir?
Ekibimiz
RSS
C# / VC#/.NET
YAZAR HAKKINDA
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ı
:
119627
Yorum Sayısı
:
10
yorum yaz
SİTE İÇİ ARAMA
Ü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.
C#nedir? hesabınız yok mu?
Üye olabilmek için
tıklayın
.
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.
Silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
Bende Yazmak İstiyorum
Blogroll
Turhal Temizer
Conda install environment.yml Package
21.11.2024
Turhal Temizer
Mac OS/X Removing CUDA
21.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak
21.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi
21.11.2024
Diğer Herşey
»
Makaleler RSS
»
Video Gönder
»
Makale Gönder
»
Serbest Köşeye Yazı Gönder
»
Yazar Başvurusu
»
C#nedir? Ekibinde Olmalıyım!
Sponsorlar
Ana Sayfa
/
Makaleler
/
Aytaç Özay
/
C# / VC#/.NET
/
C#’ta Temsilci (Delegate)ve Olay(Event) Kullanımı
C#’ta Temsilci (Delegate)ve Olay(Event) Kullanımı
Favorilerime Ekle
Gönderiliyor lütfen bekleyin...
arkadaşıma gönder
Arkadaşınızın email adresi:
*
Mesajınız:
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
arif yilmaz
/
üye hakkında
burayada bir göz atabilirsiniz https://code.replyfeed.com/sorular/151/c-sharp-delegate-kullanimi
ARA
4
2015
Emrullah Yakışan
/
üye hakkında
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
Emrullah Yakışan
/
üye hakkında
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
Melikşah Bozkurt
/
üye hakkında
Nesini anlamadınız arkadaşlar ya :D
ARA
15
2011
Aytaç ÖZAY
/
üye hakkında
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
Yunus Burak
/
üye hakkında
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
sercan genc
/
üye hakkında
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
sercan genc
/
üye hakkında
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
sercan genc
/
üye hakkında
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
Gurbetteyim .Com
/
üye hakkında
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
Dizayn ve Kodlama
bt
akademi
. Tüm Hakları Saklıdır © Copyright 2002-2009 c#nedir?com
Makaleler
Serbest Köşe
Makale Gönder
.Net TV
Video Gönder
Canlı Köşe
Kaynak Kod
Forum
Haberler
Röportajlar
Anketler
C# Nedir?
İletişim
Site Haritası
RSS
Favorilere Ekle
Üyelik
Hesap Aktivasyon
Ekibimiz
Ekibe Katıl