0

次のように、複数(10個まで)の型引数を取るアクションデリゲートを適切に使用する方法を理解しようとしています。

Action<T,T,T>例えば。

次の関数プロトタイプを使用しているとしましょう。

public void SomeFunc(Action<bool, int> foo)

その関数を呼び出すときに、ブール値と整数値をfooに渡すにはどうすればよいですか?たぶん私はこのすべてを間違っているだけなのかもしれませんが、MSDNや他のソースでそれを調べたとき、私はこのことが実際にどのように機能するかについて頭を悩ませることができません。対応するものについても同じですFunc<TReturn, T, T>

MSDNは、かなり理解しにくい例をいくつか考え出します。ここにいる誰かが、これらのデリゲートが適切に実装されている方法の例を実際に見せてくれることを願っています。ありがとう。

4

4 に答える 4

4

次のようなラムダを使用できます。

SomeFunc( (a1, a2) => {
    Console.WriteLine(string.Format("params: {0}, {1}", a1, a2));
});

または、デリゲートに一致する関数がすでにある場合は、それを直接渡すことができます。

void SomeFunc(Action<bool,int> foo)
{
    foo(true, 99);
    // stuff
}

void matchesDelegate(bool a1, int a2)
{
    Console.WriteLine(string.Format("params: {0}, {1}", a1, a2));
}

SomeFunc(matchesDelegate);

出力

パラメータ:true、99

于 2012-08-31T01:14:04.433 に答える
2

ActionFuncデリゲートは他のデリゲートと同じように機能します。単純なActionデリゲートは基本的に次のようになります。

public delegate void Action();

そしてそのように呼ばれます:

public void doAction(Action foo)
{
    Action(); // You call the action here.
}

ジェネリック引数を使用すると、定義は基本的に次のようになります。

public delegate void Action(T1, T2, T3);

そして、次のように呼び出され、パラメーターをアクションに渡します。

public void SomeFunc(Action<bool,int> foo)
{
    bool param1 = true;
    int param2 = 69;
    foo(param1, param2); // Here you are calling the foo delegate.
}

他のデリゲートと同様に、これらのデリゲートには、明示的に定義された関数を割り当てることができます。

public void AnAction()
{
    Console.WriteLine("Hello World!");
}

doAction(AnAction);

または無名関数を使用します。

Action<bool,int> anonymousAction = (b,i) =>
{
    if (b == true && i > 5)
        Console.WriteLine("Hello!");
    else
        Console.WriteLine("Goodbye!");
}
SomeFunc(anonymousAction);
于 2012-08-31T01:24:48.537 に答える
2

次のような署名付き:

public void SomeFunc(Action<bool, int> foo)

SomeFunc1つのパラメーター(2つのパラメーターを受け取るアクション)のみを呼び出して渡します。アクションをコールバックメソッドと考えてください。それが実際のことです。メソッドのどこかで、パラメータSomeFuncを呼び出しfooて渡します。自分で供給する必要はありません。

于 2012-08-31T01:15:50.533 に答える
1

fooの場合はAction<bool, t>、で呼び出すことができますfoo(true, 42)

SomeFuncを呼び出したい場合は、次のメソッドを使用して呼び出すことができます。

SomeFunc(MyMethod);

あなたが持っている場所:

public void MyMethod(bool b, int i){}

または、匿名メソッドで呼び出すことができます。

SomeFunc(delegate(bool b, int i) {Trace.WriteLine(b); Trace.WriteLine(i);});

または、ラムダで呼び出すことができます:

someFunc((b,i) => {Trace.WriteLine(b); Trace.WriteLine(i);});
于 2012-08-31T01:14:05.700 に答える