0

クラスのすべてのインスタンスで同じデリゲートの大きな静的配列があります。インスタンスメソッドへの参照を配列に入れたい、つまりインスタンスデリゲートを開く。コンパイラでエラーが発生します。それ、どうやったら出来るの?


コード例:

public class Interpreter
{
    // >7 instance fields that almost all methods need.

    private static readonly Handler[] Handlers = new Handler[]
    {
        HandleNop,          // Error: No overload for `HandleNop` matches delegate 'Handler'
        HandleBreak,
        HandleLdArg0,
        // ... 252 more
    };

    private delegate void Handler(Interpreter @this, object instruction);

    protected virtual void HandleNop(object instruction)
    {
        // Handle the instruction and produce a result.
        // Uses the 7 instance fields.
    }

    protected virtual void HandleBreak(object instruction) {}
    protected virtual void HandleLdArg0(object instruction) {}
    // ... 252 more
}

私が検討したいくつかのアイデア: すべてのインスタンス フィールドをパラメーターとして提供しますが、これはすぐに扱いにくくなります。各インスタンスのハンドラーのリストを初期化しますが、これはパフォーマンスを大幅に低下させます (このクラスの多くのインスタンスが必要です)。

4

1 に答える 1

0

Jon Skeet の別の質問に対する回答に基づいて、次のように動作します。

public class Interpreter
{
    private static readonly Handler[] Handlers = new Handler[]
    {
        (@this, i) => @this.HandleNop(i),
        (@this, i) => @this.HandleBreak(i),
        (@this, i) => @this.HandleLdArg0(i),
        // ... 252 more
    };

    private delegate void Handler(Interpreter @this, object instruction);

    protected virtual void HandleNop(object instruction) {}
    protected virtual void HandleBreak(object instruction) {}
    protected virtual void HandleLdArg0(object instruction) {}
}

C# での直接サポートは、はるかに優れています。たぶん、間接化と余分な入力を伴わないこれを行う別の方法がありますか?

于 2013-02-05T14:13:22.877 に答える