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);
}

有人可以帮我将代码从蔬菜转换为数字和 Steam --> Addition, Fry --> Multiplication, Bake --> 当两个操作数传递给它时减法。

当我看到代码工作时,我可以更好地理解它。

4

3 回答 3

0

我可能无法理解您想要什么,但我会尽力回答。请注意,我在示例中省略了许多复杂的东西,例如我将使用泛型而不是普通int值,但这只会在示例中创建冗余的复杂性。

在下面的示例中,我只定义了高阶函数,它接受两个 int 值,函数,它将两个值转换为字符串(即封装一些行为),并且它们将这个结果包含在封闭标签和开放标签中,其中一个被传入。注意,我假设您熟悉 C# 中的 lambda 表示法。

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这里就像一个盒子一样使用,两个整数作为输入,一个字符串作为输出。

第二个示例显示了我们如何将 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 回答
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 函数创建一个,该函数需要 a Func<int, int, int>,这是一个“接受 2 个整数参数并返回一个整数”的函数。这将按如下方式实施:

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

在上面的代码中,您将数字 100 和 50 传递给 DoSomeMathOperation 方法,这两个参数被传递到Func<int, int, int>. 然后返回结果。

..希望这是有道理的..

于 2012-08-21T22:53:15.570 回答