Olaylara abone olma ve abonelikten çıkma (C# Programlama Kılavuzu)
Olay tetiklendiğinde çağrılan özel kod yazmak istediğinizde başka bir sınıf tarafından yayımlanan bir olaya abone olabilirsiniz. Örneğin, kullanıcı düğmeye tıkladığında uygulamanızın yararlı bir şey yapmasını sağlamak için bir düğmenin click
olayına abone olabilirsiniz.
Visual Studio IDE kullanarak olaylara abone olmak için
Özellikler penceresini göremiyorsanız, Tasarım görünümünde, olay işleyicisi oluşturmak istediğiniz forma veya denetime sağ tıklayın ve Özellikler'i seçin.
Özellikler penceresinin en üstünde Olaylar simgesine tıklayın.
Oluşturmak istediğiniz olaya (örneğin olay)
Load
çift tıklayın.Visual C# boş bir olay işleyicisi yöntemi oluşturur ve bunu kodunuzla ekler. Alternatif olarak kodu Kod görünümünde el ile ekleyebilirsiniz. Örneğin, aşağıdaki kod satırları sınıf olayı yükselttiğinde
Form
Load
çağrılacak bir olay işleyicisi yöntemi bildirir.private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
Olaya abone olmak için gereken kod satırı, projenizdeki Form1.Designer.cs dosyasındaki yönteminde de otomatik olarak oluşturulur
InitializeComponent
. Şuna benzer:this.Load += new System.EventHandler(this.Form1_Load);
Program aracılığıyla olaylara abone olmak için
İmzası olayın temsilci imzası ile eşleşen bir olay işleyicisi yöntemi tanımlayın. Örneğin, olay temsilci türünü temel alırsa EventHandler , aşağıdaki kod yöntem saplamasını temsil eder:
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
Olaya olay işleyicisi eklemek için ekleme atama işlecini (
+=
) kullanın. Aşağıdaki örnekte, adlıpublisher
bir nesnenin adlıRaiseCustomEvent
bir olayı olduğunu varsayalım. Abone sınıfının olaylarına abone olabilmesi için yayımcı sınıfına bir başvuruya ihtiyacı olduğunu unutmayın.publisher.RaiseCustomEvent += HandleCustomEvent;
Olay işleyicisi belirtmek için lambda ifadesi de kullanabilirsiniz:
public Form1() { InitializeComponent(); this.Click += (s,e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString()); }; }
Anonim bir işlev kullanarak olaylara abone olmak için
Daha sonra bir olayın aboneliğini kaldırmanız gerekmiyorsa, olay işleyicisi olarak anonim bir işlev eklemek için ekleme atama işlecini (+=
) kullanabilirsiniz. Aşağıdaki örnekte, adlı publisher
bir nesnenin adlı RaiseCustomEvent
bir olayı olduğunu ve bir CustomEventArgs
sınıfın bir tür özel olay bilgisi taşımak için de tanımlandığını varsayalım. Abone sınıfının olaylarına abone olabilmesi için publisher
başvuruya ihtiyacı olduğunu unutmayın.
publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
Abone olmak için anonim bir işlev kullandıysanız olay aboneliğini kolayca kaldıramazsınız. Bu senaryoda aboneliği kaldırmak için olaya abone olduğunuz koda dönün, anonim işlevi bir temsilci değişkeninde depolayın ve ardından temsilciyi olaya ekleyin. Kodunuzun sonraki bir noktasında olayın aboneliğini kaldırmanız gerekiyorsa olaylara abone olmak için anonim işlevleri kullanmamanızı öneririz. Anonim işlevler hakkında daha fazla bilgi için bkz . Lambda ifadeleri.
Abonelikten çık
Olay tetiklendiğinde olay işleyicinizin çağrılmasını önlemek için olay aboneliğini kaldırın. Kaynak sızıntılarını önlemek için abone nesnesini atmadan önce olayların aboneliğini kaldırmanız gerekir. Siz bir olayın aboneliğini kaldırana kadar, yayımlama nesnesinde olayın altını çizen çok noktaya yayın temsilcisinin abonenin olay işleyicisini kapsülleyen temsilciye bir başvurusu olur. Yayımlama nesnesi bu başvuruyu barındırdığı sürece, çöp toplama abone nesnenizi silmez.
Bir olayın aboneliğini kaldırmak için
Bir olayın aboneliğini kaldırmak için çıkarma atama işlecini (
-=
) kullanın:publisher.RaiseCustomEvent -= HandleCustomEvent;
Tüm aboneler bir olayın aboneliğini kaldırdığında, yayımcı sınıfındaki olay örneği olarak
null
ayarlanır.