2011-05-25 4 views
0

私のコードで示唆しているように、かなりの量の設定が必要なStringBuilderを作成するStringBuffメソッドBuffStringを指すデリゲートを作成しようとしています。C#デリゲートとイベントのロジックと構文の問題

私の問題は、何が原因であろうと、エラーを受け取ることなく、Spriteクラス内で作成したStringBuffクラスへの参照をデリゲートのコンストラクタに渡すことができないことです。その上に、イベントを作成すると、デリゲートを開始するのに役立つかもしれないと感じています。

主な問題は、これらの2つの概念だけでなく、他のプログラミング言語で許可されている関数ポインタの置き換えとしてそれらを使用することです。

私はこの仕事をするために何が必要なのか誰かが考えているなら、私は間違いなくそれを感謝するでしょう。ここで

はコードです:

public class StringBuff 
     { 
      private static StringBuilder stringBuffer = new StringBuilder(); 

      public static StringBuilder BuffString(string _string) //--may possibly have to use IntPtr to reference stringBuffer here. 
      //This is the equivalent to the "strbuff_new" C++ method variant, designed to update the stringBuffer. 
      { 
       int iCounter = 0; 

       stringBuffer.Append(_string + " "); 

       iCounter += _string.Length + 1; 

       if (iCounter == stringBuffer.Capacity - 1) 
       { 
        stringBuffer.Capacity += stringBuffer.Capacity; 
       } 

       return stringBuffer; 
      } 
     } 

     public delegate void UpdateStringBuffer(StringBuff sender); 

     public class Sprite : SpriteInterface.ISprite 
     { 
      private StringBuff stringBuff = new StringBuff(); 

      public event UpdateStringBuffer stringBuffEvent 
      { 
       add 
       { 
        Console.WriteLine("Adding"); 
        stringBuffEvent += value; 
       } 
       remove 
       { 
        Console.WriteLine("Removing..."); 
        stringBuffEvent -= value; 
       } 
      } 

      static void Main() 
      { 
       new Sprite().stringBuffEvent += new UpdateStringBuffer(stringBuff); 
      } 




     } 
+0

同様にあなたのエラーを投稿してください。 – alexD

答えて

1

あなたがイベントやデリゲートの使用を誤解されています。

イベントハンドラをイベントに追加する場合は、イベントと同じタイプのデリゲートを渡します(正しく実行したもの)
ただし、デリゲートを作成するときは、コンストラクタほとんどの場合)はメソッド名であり、デリゲートは(リストの)関数へのポインタの一種であるため、変数ではありません。

私は、Akram Shahdaが提案したように代理人の詳細を読むことをお勧めしますが、今のところ、委譲コンストラクタにパラメータとして渡す必要があるメソッドは同じシグネチャを持つ必要があります。同じパラメータを受け入れる。ですから、例えばあなたが持っている可能性があり:

// This method have the same signature as UpdateStringBufferDelegate 
public void SomeMethod (StringBuff buff) 
{ 
    // Doing somthing here 
} 

そして、あなたはあなたのメインの中で行うことができた:

// Passing method's name and not a variable!! 
new Sprite().stringBuffEvent += new UpdateStringBuffer(SomeMethod); 

関数自体(一部StringBuff)に渡されますActuallパラメータは一度に決定しますイベントの呼びかけの
これについて詳しくお読みください。

Good Luck!

0

あなたは間違ってそれをやっている、コードの上

new Sprite().stringBuffEvent += new UpdateStringBuffer(stringBuff); 

は、以下の理由により無効です。

updateStringBufferが取っているstringBuffは、Sprite内のStringBuffのインスタンスです。

2。あなたは、静的MainメソッドからstringBuffにアクセスしています。静的Mainメソッドは、stringBuffが配置されている場所についてはまったく考えていません。

0

- デリゲートのコンストラクタには、パラメータのメソッドのみがあります。例

public delegate void UpdateStringBuffer(StringBuff sender); 

- あなたはウルイベントを宣言し、ウルSpliteクラスのウルメソッドを定義するためのメソッドを追加することができます。例:

public event UpdateStringBuffer stringBuffEvent; 

public ProcessUpdateStringBuffer(UpdateStringBuffer yourMethod) 
{ 
     stringBuffEvent += yourMethod 
} 

- とウルメインからuはイベントにウルメソッドを定義することができ、このようにそれを呼び出す:

Sprite sprite = new Sprite(); 
sprite.ProcessUpdateStringBuffer(UpdateStringBuffer(urMethod)); 
sprite.stringBuffEvent(ur parameters);