【发布时间】:2018-05-10 04:06:09
【问题描述】:
我很好奇创建代表实例的意义何在。我知道它们是函数指针,但是使用委托实例的目的是什么?
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 似乎是最好的主意,否则我为什么不直接将我的函数传递给参数呢?此外,使用 Lambda 可以更轻松地更改它来计算赔率总和,而不是像使用委托那样创建全新的方法。
【问题讨论】:
-
“是什么阻止了直接使用该方法作为参数” - 您在上面发布的代码编译了吗?它应该有,而且这样做显然应该将这个问题回答为“没有”。它奏效了,所以没有什么能阻止你。坦率地说,根本不清楚你在问什么。
-
充其量,您的问题主要是基于意见的,但这假设您已经知道无论您使用
new运算符还是仅提供方法名称,都会发生同样的事情(一个新的委托实例是创建)。后者只是隐含地这样做,编译器会为您填写new IsEven(CheckEven)。如果你不明白这一点,那么你应该把精力集中在阅读可用的文档上,因为你在这里的问题会太宽泛(所以不是关于编程语言如何工作的手把手教程的地方)。 -
我想我应该问一下使用委托实例有什么意义
-
你知道什么是 lambda 函数吗?您似乎对委托和 lambda 感到困惑。
-
@Cosmik11 - 我认为令人困惑的是 lambda 只是一种创建委托的语法。