1. Introduktion till händelser

En händelse är ett slags Något hänt . Några exempel är att knappen har tryckts in; en bock från kryssrutan tas bort. Vi vet alla, vi kallar denna typ av åtgärder som händelser .

Så låt oss överväga en form som har en knapp i den. Vi vet alla att man kan klicka på en knapp. Användaren gör åtgärden genom att klicka på en knapp och vi som kodförfattare vet inte när den åtgärden kommer att ske. Låt oss nu säga att vi gillar att skriva en kod som säger Hej där när en användare klickar på knappen. Så vad vi tänker nu.

Vi kommer att säga Inte en stor sak. Dubbelklicka på knappen, utvecklingsmiljön kommer att leda oss till en funktion och skriva koden där som säger Hello där till användaren.

Väl. Team Lead (Ja, samma kille som alltid bugar oss) frågar dig, Hey! Vi har en klass som heter Product lager, och den har lagret i handen i en heltalvariabel. Kan du exponera ett evenemang som säger lågt lager så att klienten i vår klass kan tillhandahålla en hanteringsfunktion för att hantera situationen på sitt eget sätt? . Detta kommer i slutändan att tänka på att exponera vår egen händelse i ProductStock Class och händelsen kallas Custom Event .

2. Publicera och prenumerera

Om vi ​​går tillbaka till knappen klickar du på formuläret som säger Hi där, det finns en del information vi behöver veta.

  1. En behållare kan innehålla en eller flera komponenter . Knappen placeras på formuläret som är en komponent. Formuläret är en behållare som håller knappen.
  2. Knappen klassen i dot net exponerar en händelse som heter Click. Så knappklass är utgivaren av händelseklicket.
  3. Formklassen vill veta när knappen klickades. Så det prenumererar på det publicerade Click Event. Vi kallar formuläret som abonnent för evenemanget.
  4. När du klickar på knappen på formuläret meddelar den abonnenten klickhändelsen. Och det finns en Event Handler- kod som säger Hi där, när meddelandet mottas.

Så publiceringen är inget annat än att avslöja händelsen och prenumerera är en typ av att få meddelandet om händelseshanteraren. Delegater och evenemang är tätt kopplade. Vi kommer att se hur vi skriver vårt kodeksempel.

3. Om exemplet

I det här exemplet har vi två klasser. Den ena är klassen ProductStock, som upprätthåller den aktuella lagren av produkten. Den andra klassen är Counter som används av Billing Counter-datorerna i butiken. Låt oss säga; kunden kommer till alla faktureringsräknare, informerar den produkt han vill köpa, betalar fakturan och går till förrådsrummet för att ta emot produkten. Varje faktureringsräknare får ett meddelande när produktlagret blir lågt.

Tänk på bilden nedan innan vi går vidare:

Anpassade evenemang Publicera och prenumerera |

Bilden ovan förklarar följande:

  1. Produktklassen publicerar evenemanget, LowStock.
  2. Köp, räknare osv. Klasser prenumererar på det publicerade evenemanget, LowStock.
  3. ProductStock skickar meddelandet till hela abonnenterna när Produktstocken blir låg.

I vårt exempel kommer vi inte att implementera inköpsklass och en klass som heter någon annan.

4. The ProductStock Class - Event Publisher

1) ProductStock har två medlemsvariabler. Det ena är att känna till produktnamnet, och ett annat är att hålla reda på det aktuella lagret. Nuvarande lager reduceras av försäljningsdisken när en försäljning av produkten utförs.

 // 001: Klassen upprätthåller aktuellt lager av // produkten. Den publicerar en LowStock // -händelse. Skickar meddelanden till // abonnenten om händelsen när produkten // lager går lägre än 5 public class ProductStock {// 001_1: Members Variable. public string Produktnamn; privat int lager; 

2) Den här klassen deklarerar en multicastdelegat som heter OnStockLow som tar ett händelsekällobjekt och EventArgs- objekt. Händelsekällan här är ProductStock eftersom den kommer att höja aviseringshändelsen . EventArgs Class kan packa informationen relaterad till händelsen. För att hålla det här exemplet enkelt har vi inte fått något objekt från EventArgs. Vi förklarar multicast-delegaten som visas nedan:

 // 001_2: Multicast-delegatyp som // kopplas ihop med händelsen. allmän delegat ogiltig OnStockLow (objekt avsändare, EventArgs e); 

3) Därefter förklarar vi StockLow-evenemanget. Observera hur delegaten är kopplad till händelsen. Det innebär att funktionen för meddelandehanteraren ska återgå till ogiltig. Dessutom måste det ta emot objektet som en första parameter och EventArgs som den andra parametern. Eftersom det är en Multicast-delegat kan man använda Delegate Chain med ovan nämnda funktioner. OK, nu publicerade produktlagret evenemanget. Nedan visas förklaringen av händelsen:

 // 001_3: Publicerad händelse (StockLow), // som tar ansvaret för att skicka // meddelande till scbscriber genom // ovanstående Specificerad multicast delegate public event OnStockLow StockLow; 

Notera syntaxen:

offentligt evenemang.

4) Konstruktören av klassen ProductStock initierar medlemmarna ProductName och StockInHand. Nedan är koden:

 // 001_4: Konstruktör som initierar // Lagerens offentliga produkt lager (strängnamn, öppningstock) {Produktnamn = Namn; StockInHand = Öppning lager; } 

5) Alla Counter-objekt kallar ReduceStock-funktionen när en försäljning utförs. Denna funktion minskar det aktuella lagret. Det meddelar också abonnenten om LowStock-händelsen när den aktuella aktien går mindre än fem. Nedan visas implementeringen av funktionen:

 // 001_5: Denna funktion minskar lagret // baserat på försäljningen på fakturerings // räknare. När aktien i handen är // lägre än 5 höjer den // StockLow-händelsen. public void ReduceStock (int SalesDone) {StockInHand = StockInHand - SalesDone; if (StockInHand <5) {EventArgs arg = new EventArgs (); StockLow (detta, arg); }} 

Observera att i ovanstående kod, ring till StockLow (detta, arg) kallas Raising a Event eller skicka ett meddelande. Vi är klara med implementeringen av produktklassen.

5. The Counter Class - Eventprenumerant

1) Räknarklassen deklarerar medlemsvariabeln för räknarnamnet och konstruktören initierar namnet. Försäljningsfunktionen tar Produkten lager och antalet sålda produkter. Den ringer till ReduceStock-funktionen efter räknarens försäljning. Nedan är implementeringskoden:

 // 002: Denna klass är för försäljningsräknare // som utför försäljningen på olika // räknare och gör fakturering. // Den här klassen prenumererar på den publicerade // händelsen och får meddelandet via // Multicast-delegat. public class Counter {// 002_1: Klassmedlemens privata sträng CounterName; // 002_2: Konstruktör för räknarens offentliga räknare (strängnamn) {Räknare = namn; } // 002_2: Funktion som registrerar försäljningen // som utförs på faktureringsskrivbordets öppna försäljning (ProductStock prod, int howmuch) {Console.WriteLine ("{0} Såld {1} nummer", prod.ProductName, howmuch); prod.ReduceStock (howmuch); } 

2) Räknarens klass implementerar aviseringshanteraren för StockLow. Vi bör notera att argumenten och typen av ogiltig returnering. Eftersom detta är den regel som förväntas av delegaten OnLowStock i kombination med händelsen StockLow. Nedan finns hanteraren:

 // 002_3: Funktion som fungerar som händelse // hanterare för LowStock för att ta emot // meddelande public void LowStockHandler (object Sender, EventArgs e) {Console.WriteLine ("Anouncement" + "on {0}: Stock of Product {1 } "+" gått lågt ", CounterName, ((Product lager) avsändare) .ProductName); } 

6. Huvudprogrammet - Klientkod

Nu ska vi se hur klientkoden fungerar. Innan dess en liten uppdatering av vad vi gjorde. Produktklassen visar en händelse StockLow, och den händelsen är kopplad till OnStockLow Delegate. Funktionen Reduce lager höjer StockLow-händelsen när produktlagret ligger under fem. Räknarklassen implementerar anmälningshanteraren (LowStockHandler) för att få meddelandet. Var är kodstycket som länkar LowStockHandler till StockLow-evenemanget? Vi länkar det i klientkoden som vi kommer att skriva i det här avsnittet.

1) Först skapar klienten de två faktureringsräknareobjekten. Nedan är koden för faktureringsräknare:

 klass ProgramEntry {[STAThread] static void Main (string [] args) {// Client 001: Create Billing Counters Counter billing_counter1 = new Counter ("Jupiter"); Counter billing_counter2 = new Counter ("Saturn"); 

2) Därefter skapar vi tre ProductStock-objekt. Dessa produkter kommer att säljas genom två räknare som vi skapade i föregående steg. Nedan är koden:

 // Client 002: Create the Product Stocks ProductStock prod1 = new ProductStock ("Godrej Fridge", 7); ProductStock prod2 = new ProductStock ("Sony CD Player", 6); ProductStock prod3 = new ProductStock ("Sony DVD", 800); 

3) Därefter prenumererar vi på Event Low lager som publiceras av klassen ProductStock. Vi gör detta genom att skapa en delegat som pekar på funktionen Notifiering handler. Observera att vi redan implementerade hanteraren i Counter Class och här binder vi bara den till Event. Nedan är koden:

 // Klient 003: Koppla evenemanget med // hanteraren genom delegaten. prod1.StockLow + = new ProductStock.OnStockLow (billing_counter1.LowStockHandler); prod2.StockLow + = new ProductStock.OnStockLow (billing_counter1.LowStockHandler); prod1.StockLow + = new ProductStock.OnStockLow (billing_counter2.LowStockHandler); prod2.StockLow + = new ProductStock.OnStockLow (billing_counter2.LowStockHandler); 

4) Vi ställer in allt och vi säljer produkterna för att se meddelandet när aktien är under 5. Vi kan också sätta en brytpunkt på koden nedan och undersöka hur händelserna fungerar. Nedan är koden:

 // Client 004: Nu Låt oss börja betjäna // kunderna i köen // // varje räknare Billing_counter1.Sales (prod1, 1); billing_counter2.Sales (prod1, 2); billing_counter2.Sales (prod3, 70); billing_counter2.Sales (prod2, 1); billing_counter1.Sales (prod2, 3); billing_counter1.Sales (prod3, 5); 

Komplett kodexempel och dess utgång anges nedan:

Exempel på anpassade händelser - kod och utdata

 använder System; namnområde Händelser P1 {// 001: Klassen upprätthåller aktuella lager av // produkten. Den publicerar en LowStock // -händelse. Skickar meddelanden till // abonnenten om händelsen när produkten // lager går lägre än 5 public class ProductStock {// 001_1: Members Variable. public string Produktnamn; privat int lager; // 001_2: Multicast-delegatyp som // kopplas ihop med händelsen. allmän delegat ogiltig OnStockLow (objekt avsändare, EventArgs e); // 001_3: Publicerad händelse (StockLow), // som tar ansvaret för att skicka // meddelande till scbscriber genom // ovanstående Specificerad multicast delegate public event OnStockLow StockLow; // 001_4: Konstruktör som initierar // Lagerens offentliga produkt lager (strängnamn, öppningstock) {Produktnamn = Namn; StockInHand = Öppning lager; } // 001_5: Denna funktion minskar lagret // baserat på försäljningen på fakturerings // räknare. När aktien i handen är // lägre än 5 höjer den // StockLow-händelsen. public void ReduceStock (int SalesDone) {StockInHand = StockInHand - SalesDone; if (StockInHand <5) {EventArgs arg = new EventArgs (); StockLow (detta, arg); }}} // 002: Denna klass är för försäljningsräknare // som utför försäljningen på olika // räknare och gör fakturering. // Den här klassen prenumererar på den publicerade // händelsen och får meddelandet via // Multicast-delegat. public class Counter {// 002_1: Klassmedlemens privata sträng CounterName; // 002_2: Konstruktör för räknarens offentliga räknare (strängnamn) {Räknare = namn; } // 002_2: Funktion som registrerar försäljningen // som utförs på faktureringsskrivbordets öppna försäljning (ProductStock prod, int howmuch) {Console.WriteLine ("{0} Såld {1} nummer", prod.ProductName, howmuch); prod.ReduceStock (howmuch); } // 002_3: Funktion som fungerar som händelse // hanterare för LowStock för att ta emot // meddelandet offentligt ogiltigt LowStockHandler (object Sender, EventArgs e) {Console.WriteLine ("Anouncement" + "on {0}: Stock of Product { 1} "+" gått lågt ", CounterName, ((Produkt lager) avsändare) .ProductName); }} klass ProgramEntry {[STAThread] static void Main (string [] args) {// Client 001: Create Billing Counters Counter billing_counter1 = new Counter ("Jupiter"); Counter billing_counter2 = new Counter ("Saturn"); // Client 002: Create the Product Stocks ProductStock prod1 = new ProductStock ("Godrej Fridge", 7); ProductStock prod2 = new ProductStock ("Sony CD Player", 6); ProductStock prod3 = new ProductStock ("Sony DVD", 800); // Klient 003: Koppla evenemanget med // hanteraren genom delegaten. prod1.StockLow + = new ProductStock.OnStockLow (billing_counter1.LowStockHandler); prod2.StockLow + = new ProductStock.OnStockLow (billing_counter1.LowStockHandler); prod1.StockLow + = new ProductStock.OnStockLow (billing_counter2.LowStockHandler); prod2.StockLow + = new ProductStock.OnStockLow (billing_counter2.LowStockHandler); // Client 004: Nu Låt oss börja betjäna // kunderna i köen // // varje räknare Billing_counter1.Sales (prod1, 1); billing_counter2.Sales (prod1, 2); billing_counter2.Sales (prod3, 70); billing_counter2.Sales (prod2, 1); billing_counter1.Sales (prod2, 3); billing_counter1.Sales (prod3, 5); }}} 
C # kodutmatning - anpassade händelser |