17

私は次の方法を使用しています:

public void M1(Int32 a)
{
  // acquire MyMutex
  DoSomething(a);
  // release MyMutex
}

public void M2(String s, String t)
{
  // acquire MyMutex
  DoSomethingElse(s, t);
  // release MyMutex
}

私がこれまでに発見したことから、署名が異なる 2 つのメソッドに対して単一のデリゲートを使用することはできないようです。

このようなものを書くための他の選択肢はありますか:

public void UsingMutex(...)
{
  // acquire MyMutex
  ...
  // release MyMutex
}

UsingMutex(M1);
UsingMutex(M2);

現時点で考えられるのは、2 つのデリゲートとブール値フラグを使用して、どのデリゲートを呼び出すかを知ることだけですが、それは長期的な解決策ではありません。

ジェネリックとデリゲートを組み合わせることは可能ですか? もしそうなら、あらゆる種類のドキュメントへのリンクはありますか?

環境: C# 2.0

4

3 に答える 3

20

デリゲートとジェネリックを混在させることは絶対にできます。2.0Predicate<T>などはこれの良い例ですが、同じ数の引数が必要です。このシナリオでは、おそらくオプションは、キャプチャを使用してデリゲートに引数を含めることですか?

すなわち

    public delegate void Action();
    static void Main()
    {
        DoStuff(delegate {Foo(5);});
        DoStuff(delegate {Bar("abc","def");});
    }
    static void DoStuff(Action action)
    {
        action();
    }
    static void Foo(int i)
    {
        Console.WriteLine(i);
    }
    static void Bar(string s, string t)
    {
        Console.WriteLine(s+t);
    }

Actionは.NET 3.5で定義されていますが、2.0の目的で再宣言できることに注意してください;-p

匿名メソッド ( delegate {...}) もパラメーター化できることに注意してください。

    static void Main()
    {
        DoStuff(delegate (string s) {Foo(5);});
        DoStuff(delegate (string s) {Bar(s,"def");});
    }
    static void DoStuff(Action<string> action)
    {
        action("abc");
    }
    static void Foo(int i)
    {
        Console.WriteLine(i);
    }
    static void Bar(string s, string t)
    {
        Console.WriteLine(s+t);
    }

最後に、C# 3.0 では "ラムダ" を使用することで、これがずっと簡単できれいになりますが、それは別のトピックです ;-p

于 2008-12-18T08:37:34.977 に答える
4

はい、ジェネリックとデリゲートを組み合わせることができます。

public delegate void Action<T>(T x);
public delegate void Action<T,U>(T x, U y);

public void UsingMutex<T>(Action<T> x, T t) {
    // acquire mutex...
    x(t);
    // release mutex...
}
public void UsingMutex<T,U>(Action<T,U> x, T t, U u) {
    // acquire mutex...
    x(t, u);
    // release mutex...
}

ただし、オーバーロードを使用してさまざまな数のパラメーターを処理する必要があります。

于 2008-12-18T08:40:22.507 に答える
3

Func<T>フレームワークのとデリゲートを見るAction<T>と、パラメーターの数が異なる多数の同様のデリゲートが定義されていることがわかります。ジェネリックを使用できますが、それはあなたが話している引数の数の問題を解決しません。

于 2008-12-18T08:39:02.137 に答える