0

C# でのデリゲートの使用を考慮して、パフォーマンス上の利点があるかどうか、またはプログラマにとって便利かどうかを知っている人はいますか? メソッドを保持するオブジェクトを作成している場合、呼び出されるたびにメソッドをロードするのではなく、そのオブジェクトが呼び出されるメモリ内の定数であるかのように聞こえます。たとえば、次の Unity3D ベースのコードを見ると:

public delegate H MixedTypeDelegate<G, H>(G g)

public class MainParent : MonoBehaviour // Most Unity classes inherit from M.B.
{
    public static Vector3 getPosition(GameObject g)
    {
        /* GameObject is a Unity class, and Vector3 is a struct from M.B.
        The "position" component of a GameObject is a Vector3. This method
        takes the GameObject I pass to it & returns its position. */

        return g.transform.position;
    }

    public static MixedTypeDelegate<GameObject, Vector3> PositionOf;

    void Awake( ) // Awake is the first method called in Unity, always.
    {
        PositionOf = MixedTypeDelegate<GameObject, Vector3>(getPosition);
    }
}

public class GameScript : MainParent
{
    GameObject g = new GameObject( );
    Vector3 whereAmI;

    void Update( )
    {
        // Now I can say:
        whereAmI = PositionOf(g);

        // Instead of:
        whereAmI = getPosition(g);
    }
}

. . . しかし、それは余分なステップのように思えます-それが役立つ特別な小さなことがない限り.

2 番目の質問をする最も簡潔な方法は、次のように言うことだと思います: デリゲートを理解するのに「あはは」の瞬間があったとき、コンテキスト/シナリオ/ソースは何でしたか?

4

2 に答える 2

3

デリゲートの目的の私のAhaの瞬間はイベントでした。イベントにデリゲートを追加し、各デリゲートが独自の方法でそれを処理する関数を指すようにする機能は、私には理にかなっています。

于 2012-06-21T18:35:42.727 に答える
0

デリゲートの目的は、コードに実行時の分岐点を提供することです。

class Foo
{
    public void Method1()
    {
    }

    public SomeDelegateType Method2;
}

Method1は固定コードポイントであり、これを呼び出すと常に同じコードが実行されます(Method1の本体)。Method2はデリゲートです。デリゲートは、「0個以上のメソッドへのポインター」と考えることができます。デリゲートに割り当てられた各メソッドは、追加された順序で呼び出されます。メソッドは自由に追加/削除できるため、呼び出しの結果は実行時に変更される可能性があります。

デリゲートを考える別の方法は、「変数メソッド」としてです。変数を使用して、変更可能な値を保持します。デリゲートを使用して、変更可能なメソッド「address(es)」を保持します。ここでは、答えを単純にするために「アドレス」という用語を大まかに使用します。

追加した

あなたのコメントに応えて、私が正しく理解していれば、デリゲートタイプを指定する方法を知りたいと思います。

他のタイプと同様に、デリゲートタイプを定義する必要があります。

// define a delegate type that returns 'float' and accepts zero parameters
delegate float AMethodThatReturnsSingle();

// here is a method that accepts one of those as a parameter
float Method(AMethodThatReturnsSingle d)
{
    // call the passed in delegate and return its value
    return d();
}

.Net Frameworkは、一般的な状況に役立つ多数のデリゲートタイプを提供します。これは、ジェネリックFunc<>デリゲートタイプを使用する上記で宣言したカスタムデリゲートの代わりになります。

float Method(Func<float> d)
{
    // call the passed in delegate and return its value
    return d();
}

Funcには、パラメーターをサポートするためのいくつかのフレーバーがあります。

// Encapsulates a method that has no parameters and returns a value of the type
//     specified by the TResult parameter.
delegate TResult Func<TResult>();
// Encapsulates a method that has one parameter and returns a value of the type
//     specified by the TResult parameter.
delegate TResult Func<T, TResult>(T arg);
// Encapsulates a method that has two parameters and returns a value of the type
//     specified by the TResult parameter.
delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);

何もAction<>返さず、指定したタイプの0個以上のパラメーターを受け取るものもあります(最大4つが定義されていると思います)。

boolを返し、指定したタイプの1つ以上のパラメーターを受け取るものがありPredicate<>ます。

EventHandler<T>そして、イベントに使用するのに推奨されるタイプであるユビキタスがあります。

ほんの数例を挙げると。

于 2012-06-21T19:16:02.890 に答える