委托实例直接传递函数

时间:2017-11-26 23:25:56

标签: c# linq lambda c#-7.0

我很好奇创建代理实例的重点是什么。我知道它们是函数指针,但使用委托实例的目的是什么?

public delegate bool IsEven(int x);

class Program
{
    static void Main(string[] args)
    {
        int[] nums = new int[] { 1, 3, 4, 5, 6,7, 8, 9 };

        // creating an instance of delegate and making it point to 'CheckEven' function    
        IsEven isEven = new IsEven(CheckEven);

        // using delegate for parameter to get sum of evens
        int tot1 = Sums(nums, isEven);

        // passing in the function directly as parameter and not delegate instance
        int tot2 = Sums(nums, CheckEven);

        // using lambda expressions
        int tot3 = Sums(nums, x=> x%2==0);

        ReadKey();
    }

    public static int Sums(int[] nums, IsEven isEvenOdd)
    {
        int sum = 0;

        foreach(int x in nums)
        {
            if (isEvenOdd(x))
                sum += x;
        }

        return sum;
    }

    public static bool CheckEven(int x)
    {
        if (x % 2 == 0)
            return true;
        else 
            return false;
    }
}

一开始以为选择总是使用lambdas似乎是最好的想法,如果你要传递的函数的功能没有复杂的实现,否则为什么我不能直接将我的函数传递给参数?同样使用Lambdas,更容易更改它来计算赔率总和,而不是像创建一个全新的方法一样,与代表一样。

1 个答案:

答案 0 :(得分:0)

即使您直接传递了方法,您已经使用了委托,如果没有通过委托定义设置期望,Sums方法也无法接收方法名称。

考虑将代理名称更改为public delegate bool EvenOddStatus(int x);

您可以发送CheckEven方法或此方法:

public static bool CheckOdd(int x)
    {
        if (x % 2 != 0) // here changed
            return true;
        else return false;
    }

(当然你可以在这里使用lambda,但不能在更复杂的场景中使用)

现在,您的Sums方法可以根据调用代码(传递CheckEvenCheckOdd)总结奇数或偶数。

代表是方法的指针。您可以定义代码希望方法接收和返回的方式,并且调用代码可以在以后通过预定义的实现(方法或委托)。

如果您的Main是另一种不知道要总和,赔率或均衡的方法怎么办?它将有一个来自堆栈调用代码的委托。