我很好奇创建代理实例的重点是什么。我知道它们是函数指针,但使用委托实例的目的是什么?
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,更容易更改它来计算赔率总和,而不是像创建一个全新的方法一样,与代表一样。
答案 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
方法可以根据调用代码(传递CheckEven
或CheckOdd
)总结奇数或偶数。
代表是方法的指针。您可以定义代码希望方法接收和返回的方式,并且调用代码可以在以后通过预定义的实现(方法或委托)。
如果您的Main
是另一种不知道要总和,赔率或均衡的方法怎么办?它将有一个来自堆栈调用代码的委托。