Megosztás a következőn keresztül:


Feliratkozás és leiratkozás eseményekről (C# programozási útmutató)

Előfizethet egy olyan eseményre, amelyet egy másik osztály tett közzé, amikor egyéni kódot szeretne írni, amelyet az esemény létrehozásakor hívunk meg. Előfordulhat például, hogy feliratkozik egy gomb eseményére click , hogy az alkalmazás valami hasznosat tegyen, amikor a felhasználó a gombra kattint.

Eseményekre való feliratkozás a Visual Studio IDE használatával

  1. Ha nem látja a Tulajdonságok ablakot, Tervező nézetben kattintson a jobb gombbal arra az űrlapra vagy vezérlőelemre, amelyhez eseménykezelőt szeretne létrehozni, és válassza a Tulajdonságok lehetőséget.

  2. A Tulajdonságok ablak tetején kattintson az Események ikonra.

  3. Kattintson duplán a létrehozni kívánt eseményre, például az Load eseményre.

    A Visual C# létrehoz egy üres eseménykezelő metódust, és hozzáadja a kódhoz. Másik lehetőségként manuálisan is hozzáadhatja a kódot a Kód nézetben. Az alábbi kódsorok például deklarálnak egy eseménykezelő metódust, amely akkor lesz meghívva, amikor az Form osztály létrehozza az eseményt Load .

    private void Form1_Load(object sender, System.EventArgs e)
    {
        // Add your form load event handling code here.
    }
    

    Az eseményre való feliratkozáshoz szükséges kódsor is automatikusan létrejön a InitializeComponent Form1.Tervező metódusban. cs fájl a projektben. A következőhöz hasonló:

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

Eseményekre való feliratkozás programozott módon

  1. Definiáljon egy eseménykezelő metódust, amelynek aláírása megegyezik az esemény delegált aláírásával. Ha például az esemény a EventHandler delegált típusán alapul, a következő kód a metódus csonkját jelöli:

    void HandleCustomEvent(object sender, CustomEventArgs a)  
    {  
       // Do something useful here.  
    }  
    
  2. Az összeadás-hozzárendelési operátor (+=) használatával csatoljon egy eseménykezelőt az eseményhez. Az alábbi példában tegyük fel, hogy egy elnevezett publisher objektumnak van egy eseménye.RaiseCustomEvent Vegye figyelembe, hogy az előfizetői osztálynak szüksége van egy hivatkozásra a közzétevő osztályra az eseményekre való feliratkozáshoz.

    publisher.RaiseCustomEvent += HandleCustomEvent;  
    

    Lambda-kifejezéssel is megadhat egy eseménykezelőt:

    public Form1()  
    {  
        InitializeComponent();  
        this.Click += (s,e) =>
            {
                MessageBox.Show(((MouseEventArgs)e).Location.ToString());
            };
    }  
    

Eseményekre való feliratkozás névtelen függvény használatával

Ha később nem kell leiratkoznia egy eseményről, a hozzáadás-hozzárendelési operátorral (+=) csatolhat egy névtelen függvényt eseménykezelőként. A következő példában tegyük fel, hogy egy elnevezett publisher objektumnak van egy eseménye, RaiseCustomEvent és hogy egy CustomEventArgs osztály is definiálva van valamilyen speciális eseményinformáció hordozására. Vegye figyelembe, hogy az előfizetői osztálynak szüksége van egy hivatkozásra publisher az eseményekre való feliratkozáshoz.

publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{  
  string s = o.ToString() + " " + e.ToString();  
  Console.WriteLine(s);  
};  

Az eseményről nem lehet egyszerűen leiratkozni, ha névtelen függvényt használt a feliratkozáshoz. Ha le szeretne iratkozni ebben a forgatókönyvben, lépjen vissza arra a kódra, amelyre előfizet az eseményre, tárolja a névtelen függvényt egy delegált változóban, majd adja hozzá a meghatalmazottat az eseményhez. Javasoljuk, hogy ne használjon névtelen függvényeket az eseményekre való feliratkozáshoz, ha le kell iratkoznia az eseményről a kód egy későbbi pontján. A névtelen függvényekről további információt a Lambda-kifejezésekben talál.

Leiratkozás

Ha meg szeretné akadályozni az eseménykezelő meghívását az esemény indításakor, leiratkozhat az eseményről. Az erőforrásszivárgások elkerülése érdekében le kell iratkoznia az eseményekről, mielőtt eltávolít egy előfizetői objektumot. Amíg le nem iratkozik egy eseményről, az eseményt a közzétételi objektum alapjául képező csoportos küldési meghatalmazott hivatkozik arra a meghatalmazottra, amely az előfizető eseménykezelőjét foglalja magában. Amíg a közzétételi objektum tartalmazza ezt a hivatkozást, a szemétgyűjtés nem törli az előfizetői objektumot.

Eseményről való leiratkozás

  • A kivonás-hozzárendelés operátorával (-=) leiratkozhat egy eseményről:

    publisher.RaiseCustomEvent -= HandleCustomEvent;  
    

    Ha az összes előfizető leiratkozott egy eseményről, a közzétevő osztály eseménypéldánya a következőre nullvan állítva: .

Lásd még