0

http://simpleprogrammer.com/2010/09/24/explaining-what-action-and-func-are/

上記のコードは、Action と Func について簡単に説明しています。それでも私はそれが100%のものを手に入れていません。または、コードを機能させることができません。

public void SteamVegetable(Vegetable vegetable, int timeInMinutes)
{
    CookVegetable(vegetable, Steam, timeInMinutes);
}

public void FryVegetable(Vegetable vegetable, int timeInMinutes)
{
    CookVegetable(vegetable, Fry, timeInMinutes);
}

public void BakeVegetable(Vegetable vegetable, int timeInMinutes)
{
    CookVegetable(vegetable, Bake, timeInMinutes);
}

public void CookVegetable(Vegetable vegetable,
   Action<Vegetable, CookingTime> cookingAction,
   int timeInMinutes)
{
    Clean(vegetable);
    cookingAction(vegetable, Minutes.Is(timeInMinutes));
    Serve(vegetable);
}

2つのオペランドが渡されたときに、コードを野菜から数字に変換し、Steam --> Addition、Fry --> Multiplication、Bake --> 減算するのを手伝ってくれませんか。

コードが機能しているのを見ると、理解が深まります。

4

3 に答える 3

0

私の例を紹介します。私はそれを単純にしようとしたので、うまくいけばこれが役立つでしょう。

これを例に取ってください:

class MathClass {
    public int Add(int number1, int number2) {
        return DoSomeMathOperation(number1, number2, theAddingIsActuallyDoneHere); // The method "theAddingIsActuallyDoneHere" below is what gets called.
    }

    private int theAddingIsActuallyDoneHere(int number1, int number2) {
        return number1 + number2;
    }

    public int Multiply(int number1, int number2) {
        return DoSomeMathOperation(number1, number2, theMultiplicationIsDoneHere); // The method "theMultiplicationIsDoneHere" is what gets called.
    }

    private int theMultiplicationIsDoneHere(int number1, int number2) {
        return number1 * number2;
    }

    public int DoSomeMathOperation(int number1, int number2, Func<int, int, int> mathOperationFunc) {
        return mathOperationFunc(number1, number2); // This is where you call the method passed in above.
    }
}

上記のコードは、次のように使用できます。

MathClass mathClass = new MathClass();

Console.WriteLine(mathClass.Add(5, 10)); // displays 15
Console.WriteLine(mathClass.Multiply(5, 5)); // displays 25

ただし、減算法が必要だったと想像してみてください。DoSomeMathOperation関数を使用して作成できます。このFunc<int, int, int>関数は、「2つの整数パラメーターを受け取り、整数を返す」関数です。これは次のように実装されます。

Console.WriteLine(mathClass.DoSomeMathOperation(100, 50, (num1, num2) => num1 - num2)); // displays "50"

上記のコードでは、数値100と50をDoSomeMathOperationメソッドに渡し、これら2つのパラメーターをに渡しますFunc<int, int, int>。その後、結果が返されます。

..うまくいけば、それは理にかなっています..

于 2012-08-21T22:53:15.570 に答える
0

私はあなたが何を望んでいるかを理解するのに間違っているかもしれませんが、私はそれに答えようとします. 単純な値の代わりにジェネリックを使用するなど、例では多くの複雑なことを省略していることに注意してください。ただし、intこれは例で冗長な複雑さを生み出すだけです。

以下の例では、2 つの int 値を取る高次関数 function を定義するだけで、2 つの値を文字列に変換し (つまり、何らかの動作をカプセル化します)、この結果を囲みタグと開始タグに組み込み、そのうちの 1 つが渡されます。 、C# のラムダ表記に精通していると仮定します。

ApplyAndPrettyPrint(100, 3, "summ of 100 and 3 is equal to: ", (x,y) => (x*y).ToString("N0"));
ApplyAndPrettyPrint(100, 3, "100 to power 3 is:  ", (x,y) => (Math.Pow(x,y)).ToString("N0"));
ApplyAndPrettyPrint(2, 33, "2 * root of 33 is:  ", (x,y) => (x * Math.Sqrt(y)).ToString("N0"));

public void ApplyAndPrettyPrint( int firstNumber, int secondNumber, string startTag, Func<int, int, string> evaludationFunction) 
{
    string result = startTag;
    result += evaludationFunction(firstNumber, secondNumber);
    result += ";";
    Console.WriteLine (result);
}

ここFuncでは、2 つの整数を入力として、1 つの文字列を出力として、ボックスのように使用します。

2 番目の例は、Action をメソッドに渡す方法を示しています。これは、数値の配列に対して評価されます。ここでも、IEnumerable インターフェイスとジェネリックの詳細は省略します。

int[] numbers = new []{ 1, 2, 4, 5, 6, 7 };
ApplyForEach(numbers, (x) => Console.WriteLine ("square of {0} is {1}", x, x*x));

public void ApplyForEach(int[] numbers, Action<int> someFunction)
{
    foreach (var number in numbers)
    {
        someFunction(number);
    }
}

結果は、いくつかの説明的な文字を含む整数の二乗を出力するだけです。つまりAction、出力のないデリゲートです。それらは、いくつかの入力を備えたボックスと考えることができますが、出力はまったくありません。

これがあなたの理解のためにうまくいくことを願っています。Actionつまり、デリゲート型との唯一の違いFuncは、最後のジェネリック型のセマンティクスです。Func では戻り値であり、Action では戻り値は void であるため、最後のジェネリック型は入力パラメーターに渡されます。

このトピックがやや難しいと思われる場合は、Jon Skeet が著書「C# in Depth」の第 5 章「Fast-tracked delegates」でデリゲートについて説明しています。

于 2012-08-21T22:46:46.617 に答える
0

あなたが提供した例では、FrySteam、およびBakeはおそらくメソッドであると想定されています。

基本的に、Actions とFuncs を使用すると、コードのチャンクをメソッドに渡してから、そのコードのチャンクを実行できます。

だから、あなたはできる

public void Foo(Action<int> actionToPerform, int someInt)  
{
    actionToPerform(someInt);
}

Foo次に、整数を取る「コードのチャンク」でメソッドを使用できます。

そう、

public void Bar() 
{
     Action<int> writeToConsole = i =>  { Console.WriteLine(i); }
     Action<int> writeToSomeLogger = i => { Logger.WriteLog(i); }
     Foo(writeToConsole, 10);
     Foo(writeToSomeLogger, 100);
}
于 2012-08-21T22:46:49.197 に答える