6

デリゲートに関するMSDN ページを読んでいますが、それらは簡単に見えます。次に、それらを使用するいくつかのコードを見ていましたが、これを見ました:

 public delegate void NoArguments();
 public NoArguments Refresh = null;
 Refresh = new NoArguments( Reset );

私を混乱させるのはその3行目です。どうすればnew代理人になれますか? これはオブジェクトではなく、メソッド、またはメソッドへのデリゲートです。MSDN ページの例によると、デリゲートのインスタンスの作成は、割り当てではなく単純な割り当てによって行われます。さらに、デリゲート宣言がパラメーターを取らないのに、デリゲートの がnewパラメーターを取るのはなぜですか?Reset

4

3 に答える 3

4

キーワードは、後delegateに続くものが本質的に関数シグネチャであることを示しているため、Refresh引数を取らない関数へのポインターのようなものになります。ただし、ポインターに何かを割り当てるには、Refreshポインターにポイントする関数を指定する必要があります。この場合、それはReset関数です。さらに、Reset関数は引数を取ってはなりません。

さらに、構文は次のとおりです。

Refresh = Reset;

も有効であり、より正式な構文の単なる構文糖衣です。

Refresh = new NoArguments(Reset);

どちらの場合も、Refresh を呼び出して Reset 関数を実行できます。

Refresh();

ただし、Refresh()割り当てられていない状態で実行すると、例外が発生する可能性があることに注意してください。これを防ぐ方法は、null に対してチェックすることです。

if (Refresh != null) Refresh();
else {
    // Refresh was never assigned
}
于 2013-07-09T04:02:11.487 に答える
2

デリゲートは関数型のようなものだと思うかもしれません:

  • 型を宣言すると、関数は void を返し、引数はありません。

    public delegate void NoArguments();
    
  • 指定された型の変数を宣言して初期化します。

    public NoArguments Refresh = null;
    
  • 新しいオブジェクトを変数に割り当てます。Object は実際には functionResetであり、デリゲートと同じシグネチャを持つ必要があります。

    Refresh = new NoArguments( Reset );
    

アップデート:

詳細については、次のリンクを参照してください: C# デリゲート

于 2013-07-09T04:03:07.650 に答える