2017-07-12 9 views
-3

私はC#で 'イベント'プログラミングに関するいくつかの習慣を作っています。教科書からサンプルプログラムを複製した後は、この本の説明どおりに動作しません。私は何度か点検したが、エラーがどこにあったかをまだ見つけることはできない。もし誰かがそれを理解するのを助けることができれば、私はそれを感謝します。このイベントが期待した結果を出力できないのはなぜですか?

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); 
} 
} 

あなたが見ることができるように期待される結果は8でなければなりませんが、私の結果は次の2つのインクリメンタ、1があなたのコンストラクタに渡されている(そして、使用されていない)とデルを持っ0

+0

コードのようなテキストデータを投稿するためにビットマップを使用しないでください。投稿テキスト。 –

+1

downvoteを取得する理由は、画像を介して共有されたコードです。質問自体にあなたのコードを教えてください。働いていないとどういう意味ですか? –

+0

あなたのバグは、渡されたものを使うのではなく、 'Dozens()'コンストラクタで新しい 'Incrementer()'を作成しています。渡されたものを使うと、あなたが読んでいる 'DozensCount'はあなたが書いているものと同じものになります。 –

答えて

1

ですインクリメンタ聞いていますが、DoCountは決して呼び出されていません。

デルインクリメンタを削除し、del.CountedADozenをincrementer.CountedADozenに置き換えます。これは、このデザインパターンで使用するインクリメンタです。

+0

私はこれをしましたが、デバッガは、 "非静的フィールド、メソッド...のためにオブジェクト参照が必要です"と言っています。私はIncrementerの新しいオブジェクトを作成する前にそれを行いました。 –

+0

イベントリスナーのインクリメンタ用の小文字のi incrementer.CountedADozen + = IncrementDozensCount; – Xela

+0

問題のある箇所が見つかりました。あなたの答えと忍耐をありがとう。 :) –

関連する問題