アクションの代理人と同等のメソッドの名前を作るのは何ですか?

私はちょうど実験して、次のスニペットで終わった:

public static class Flow {
    public static void Sequence(params Action[] steps) {
        foreach (var step in steps)
            step();
    }
}
void Main() {
    Flow.Sequence(() => F1(),() => F2());
    Flow.Sequence(F1, F2);//<-- what makes this equiv to the line above?

}
void F1() { }
void F2() { }

メソッド名だけがアクションと同じであることはわかりませんでした。

これを何にしていますか?

5
実際には同等ではありません。後者は、余分な空のメソッド呼び出しを避けるため、より優れています。 (私は、最適化されているかもしれませんが、まだそれは同等です)
追加された 著者 Andrew Barber,

3 答え

C#では、デリゲートはメソッドポインタ。クラス内の既存のメソッド、または独立した匿名のデリゲートオブジェクトを完全に指すことができます。

上記のリンクのこの段落は、コード内で何が起こっているのかを説明する必要があります。

戻り値の型とパラメータで構成されるデリゲートのシグネチャに一致するメソッドはすべて、デリゲートに割り当てることができます。これにより、プログラムでメソッド呼び出しを変更したり、新しいコードを既存のクラスにプラグインすることができます。デリゲートの署名を知っている限り、独自のデリゲートメソッドを割り当てることができます。

つまり、デリゲート型を解決する際には、名前ではなく署名が考慮されます。

あなたの場合、パラメータを持たず何も返さない F1()および F2()メソッドは、パラメータなしの アクションデリゲート

public delegate void Action();

したがって、それらは Action に暗黙的に変換可能です。

異なる戻り値の型または少なくとも1つのパラメータを持つメソッドを渡そうとすると、 Action の署名に対応しないため、コンパイル時エラーが発生します。

7
追加された
@xixonia: "直接"ではなく、 Action のインスタンスも作成されますが、この Action メソッドは F1 メソッドから直接作成されます。 ()<> を使用している間、 ActionF1()が呼び出される匿名メソッドから作成されます。
追加された 著者 Danny Chen,
そして、()=> F1()の代わりに F1 を使うと、メソッドを直接呼び出すことができます。
追加された 著者 cwharris,
@ダニーチェン、少なくともより直接的にはない。 :)訂正してくれてありがとう。私はそれを正しく述べていないと心配した。
追加された 著者 cwharris,

基本的に、これはバックグラウンドで起こっていることのようなものです。

void Main() 
{    
    Flow.Sequence(new Action(delegate(){ F1(); }), new Action(delegate(){ F2(); }));    
    Flow.Sequence(new Action(F1), new Action(F2)); 
}

彼らはまったく同等ではありませんが、非常に近いです。実行時に同じ結果がレンダリングされますが、唯一の違いは、最初のSequence呼び出しの引数が、匿名メソッドを呼び出して静的メソッドF1とF2を呼び出すActionであることです。 2番目のSequence呼び出しは、静的メソッドF1およびF2を呼び出すActionです。

私はこれが役立つことを願っています

3
追加された
心配しないで、私はあなたのためにそれを修正しました。
追加された 著者 BoltClock,
モバイルデバイスを使用して書式を間違ってください。 :-P
追加された 著者 Kevin Carrasco,

コンパイラは、メソッドグループから互換性のある型のデリゲートへの暗黙の変換を使用します(この場合、引数を取らないvoid戻りメソッド)。ここでのメソッド名は無関係です。

0
追加された