gpt4 book ai didi

c# - C# 中的委托(delegate)(未解释)示例 - 看起来与方法调用相同

转载 作者:行者123 更新时间:2023-11-30 19:02:49 24 4
gpt4 key购买 nike

我终于明白了如何使用委托(delegate),但无法真正弄清楚为什么要使用委托(delegate)而不是方法调用。我发现这个答案粘贴在下面,但我无法弄清楚这两者之间的最大区别是什么,因为我可以简单地说

double tot1 = CalcTotalMethod1(100.34);
double tot2 = CalcTotalMethod2(100.34);

代替

double tot1 = CalcMyTotal(100.34, CalcTotalMethod1);
double tot2 = CalcMyTotal(100.34, CalcTotalMethod2);

这是一个例子:

public static double CalcTotalMethod1(double amt)
{
return amt * .014;
}

public static double CalcTotalMethod2(double amt)
{
return amt * .056 + 42.43;
}


public delegate double calcTotalDelegate(double amt);

public static double CalcMyTotal(double amt, calcTotalDelegate calcTotal)
{
return calcTotal(amt);
}

double tot1 = CalcMyTotal(100.34, CalcTotalMethod1);
double tot2 = CalcMyTotal(100.34, CalcTotalMethod2);
Console.WriteLine(tot1);
Console.WriteLine(tot2);

最佳答案

区别在于你告诉CalcMyTotal使用哪种方法 - 功能组合。 CalcMyTotal不知道所涉及的任何一种方法(或任何其他你能想到的方法)——也不需要。它只需要知道“你给我一个做某事的方法,我就会去做”。在一个更典型的例子中,CalcMyTotal会做一些比调用方法更多的事情,例如:

var somethingTricky = LotsOfWork(amt);
var intermediateValue = calcTotal(somethingTricky);
return SomeMoreWork(intermediateValue);

这里的要点:调用者不需要知道CalcMyTotal里面发生了什么- 它只需要提供一些机制来“计算总计”;和 CalcMyTotal不需要了解所涉及的机制。您可以将其视为单一方法接口(interface)。

为了完整起见,您也可以这样做(也许更清楚):

public static double CalcMyTotal(double amt, Func<double,double> calcTotal) {...}

(注意 Func<...> 用法),并使用 lambda 语法调用:

double tot1 = CalcMyTotal(100.34, amt => amt * 0.014);

关于c# - C# 中的委托(delegate)(未解释)示例 - 看起来与方法调用相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8947347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com