2017-07-12 2 views
-3

Ich mache einige Übungen über die 'Event'-Programmierung in C#. Nach dem Duplizieren eines Beispielprogramms aus dem Lehrbuch kann es nicht funktionieren, wie dieses Buch sagte. Ich habe einige Male nachgesehen und kann den Fehler nicht finden. Ich werde es schätzen, wenn jemand mir helfen kann, es herauszufinden.Warum kann dieses Ereignis nicht das erwartete Ergebnis ausgeben?

using System; 
delegate void Handler(); 

class Incrementer 
{ 
    public event Handler CountedADozen; 

public void DoCount() 
{ 
    for (int i = 1; i < 100; i++) 
     if (i % 12 == 0 && CountedADozen != null) 
      CountedADozen(); 
} 
} 

class Dozens 
{ 
public int DozensCount { get; private set; } 
public Dozens(Incrementer incrementer) 
{ 
    DozensCount = 0; 


    Incrementer.CountedADozen += IncrementDozensCount; 
} 
void IncrementDozensCount() 
{ 
    DozensCount++; 
} 
} 

class program 
{ 
static void Main() 
{ 
    Incrementer incrementer = new Incrementer(); 
    Dozens dozensCounter = new Dozens(incrementer); 

    incrementer.DoCount(); 
    Console.WriteLine("Number of dozens={0}", dozensCounter.DozensCount); 
} 
} 

Das sollte erwartete Ergebnis 8 sein, wie du mein Ergebnis sehen können, aber ist 0.

+0

Verwenden Sie keine Bitmaps, um Textdaten wie Code zu senden. Beitragstext –

+1

Der Grund, warum Sie einen Downvote erhalten, ist der Code, der über das Bild geteilt wird. Bitte teilen Sie Ihren Code in der Frage selbst. Was meinst du mit nicht arbeiten? –

+0

Wie für Ihren Fehler, erstellen Sie eine neue 'Incrementer()' in Ihrem 'Dozens()' -Konstruktor, anstatt die, die übergeben wurde. Tun Sie das nicht. Benutze das, das übergeben wurde, und dann wird der 'DozensCount', den du liest, derselbe sein, den du schreibst. –

Antwort

1

Sie haben zwei Inkrementierern, ein in Ihrem Konstruktor übergeben wird (und verwendet wird, ist nicht) und die del Inkrementierer hört zu, aber DoCount wird nie darum gebeten.

Entfernen Sie den Del Incrementer und ersetzen Sie del.CardedADozen durch incrementer.CardedADozen, da dies der Inkrementierer ist, den Sie in diesem Entwurfsmuster verwenden möchten.

+0

Ich habe dies getan, aber der Debugger sagte, dass "eine Objektreferenz für das nicht-statische Feld, Methode ... erforderlich ist". Ich habe es gemacht, bevor ich ein neues Objekt von Incrementer erstellt habe. –

+0

Kleinbuchstaben i für Inkrementierer für Ihren Ereignis-Listener incrementer.CountedADozen + = IncrementDozensCount; – Xela

+0

Ich habe gefunden, wo das Problem liegt. Danke für deine Antwort und Geduld. :) –

Verwandte Themen