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

  1. Ö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.

  2. Özellikler penceresinin en üstünde Olaylar simgesine tıklayın.

  3. 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 FormLoad ç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ı da Form1.Tasarım Aracı yönteminde otomatik olarak oluşturulurInitializeComponent. projenizdeki cs dosyası. Şuna benzer:

    this.Load += new System.EventHandler(this.Form1_Load);  
    

Program aracılığıyla olaylara abone olmak için

  1. İ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.  
    }  
    
  2. Olaya olay işleyicisi eklemek için ekleme atama işlecini (+=) kullanın. Aşağıdaki örnekte, adlı publisher bir nesnenin adlı RaiseCustomEventbir 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 nullayarlanır.

Ayrıca bkz.