2016-12-02 3 views
1

"コールバックパターン"を理解しようとしています。すべての答えは、これは代理人(私がそれらを知っている)と一緒に行われると言います。しかし、答えのコードは次のようなものです:C#代理人とはなぜ必要なのですか?

私は本当に理解できません、なぜこれを委任する必要がありますか?私たちもこの方法でこれを行うことができますか?

public void Test() 
{ 
    DoWork(); 
} 

public void DoWork() 
{ 
    CallbackFunction("Hello world"); 
} 

public void CallbackFunction(string result) 
{ 
    Console.WriteLine(result); 
} 

さらに、コールバックとは、イベント後のメインプログラムの「特定の機能」への実際の「復帰」を意味します。しかし、デリゲートを使用する場合、別のメソッドを呼び出すだけではありませんか?

最後にOnFail()メソッドが失敗したコールバックを作成し、成功するとOnSuccess()メソッドをコールバックすることができます。私は本当に混乱しています。誰かが私にこれを理解するのを助けることができますか?

+0

デリゲートは '現在のコンテキストで使用することができる機能のテンプレートですDoWorkあなたの場合には。最も簡単な例はイベントハンドラです。 – Fabio

+0

私は知っていますが、なぜ私はそれを使うべきですか?特にコールバック?コールバックしていませんか?さらに、名前を持つメソッドを呼び出すことと、メソッドの名前を呼び出す代理人を呼び出すことの違いは何ですか? – Zapdos

+0

デリゲートを使用する理由については、いくつかの回答があります。 http://stackoverflow.com/questions/3567478/delegates-why – Equalsk

答えて

0

デリゲートは、メソッドの一種であるテンプレートを、そのシグネチャ内の関数に安全にカプセル化します。時には、それが関数へのポインタであると考えるのは簡単です。

サンプルでは、​​CallbackFunctionCallbackに設定できます。その定義には文字列引数のみが使用されるためです。

delegateの代わりにActionFuncを使用できます。それらの違いは、Actionが何かを返さず、Funcが返ってくるということです。

public void Test(Action success, Action<Exception> error) 
{ 
    try 
    { 
     // perform some task 
     success(); 
    } 
    catch (Exception ex) 
    { 
     error(ex); 
    } 
} 

そして、それを使用します:サンプルについて

Test(() => { Console.WriteLine("Success"); }, 
    (ex) => { Console.WriteLine($"Error: {ex.Message}"); }); 

Actionの一般的なオプションでは、このメソッドにPASできる引数の型があります。サンプルでは、​​Exceptionが、errorActionに渡される引数です。同じものがFunc<>に対して有効ですが、Funcの最後のタイプが結果タイプです。

+0

ありがとうございます。私の主な問題は、メインクラスの関数に戻ります。私は代理人を使ってこのようなことをどうやってできるのかを探そうとしています。 – Zapdos

0

なぜ代理人が必要ですか?

多くのプログラムでは、メソッドの概念を抽象化する必要があるためです。一つの理由は、イベントで、他にはこのようなメソッドのセットです。つまり

public void DoWork(Action completeCallback) 
{ 
    ... //Do Stuff 
    completeCallback(); 
} 

public void FirstMainMethod() 
{ 
    DoWork(() => Console.WriteLine("First callback"); 
} 

public void SecondMainMethod() 
{ 
    DoWork(() => Console.WriteLine("Second callback"); 
} 

は、私のコードの異なる部分が完了上の異なるメソッドの実行を持っている必要がありますが、私は、私はできません(それを渡しますダイレクトコールを使用してください)。デリゲートの抽象化によってこれが可能です。また、.NETでの「完了」コールバックのアイデアはかなり愚かです。ほぼは決してが必要です。あなたはこの一般的なアイデアの代理人を常に使用するでしょうしかし。

最終的に失敗した場合にOnFail()メソッド、成功した場合にOnSuccess()メソッドを呼び出すコールバックを作成するにはどうすればよいですか?

これはかなり簡単に行うことができます。(あなたはあなたを気にするをしたいかどうかわからないが、次のコードは動作します)あなたも、やや一般的なものを作ることができます。

public void SuccessFailHelper(Func<bool> work, Action success, Action failure) 
{ 
    if (work()) 
     success(); 
    else 
     failure(); 
} 
+0

これはこれまでのところ最も有益な回答です。しかし、私はまだ完全に理解していませんでした。 2つの結果(OnFailとOnSuccess)のために2人の代議員が必要です。私はこれについて考え、ここに再度書きます。 – Zapdos

+0

@Zapdosもしあなたが2つのデリゲート*デクリメント*(つまり、 'delegate'キーワードの使用)を必要としないなら、onFailコールバックとOnSuccessコールバックを2つのデリゲート"オブジェクト " – BradleyDotNET

関連する問題