委托的使用方法

8

我看到委托被用于自定义事件,例如:

delegate string FuncRef(string Val);

FuncRef fValue = GetFieldName;

fValue("hello");

在这里,我只是声明了一个委托,并将函数名称分配给委托,每当需要时就像fValue(“hello”);一样调用。

与通过委托调用GetFieldName()相比,我可以直接调用它。 所以我想知道为什么应该使用委托调用函数,而我们可以直接调用函数....通过委托调用任何函数的优点是什么。

因此,请告诉我除事件处理外何时需要使用委托。 请使用示例代码指导我并模拟需要通过委托调用函数的情况,除了事件处理。 请向我展示一些现实生活场景,在这些场景中,我们必须通过委托调用函数。


1
http://msdn.microsoft.com/en-us/netframework/aa904594 - asawyer
委托是LINQ到对象的基本组成部分。 - spender
8个回答

5
使用委托而非直接调用函数的原因是相同的,这也是您使用其他高级编程技术的原因之一:将代码解耦并提高可维护性。
var taxRate = 0.15;
var taxAmount = income * taxRate;

替代

var taxAmount = income * 0.15;

换句话说:使用变量来保存对可调用实体的引用(委托就是这样一个实体),允许您编写可以根据传递给它的参数(我们传递的委托的值)更改其行为的代码。这意味着更灵活的代码。
关于使用委托的代码示例,您可以查看LINQ(当然),但还有“委托101”示例,它在任何语言中都是相关的:过滤列表。 (链接)

MSDN上没有委托101的链接。我在谷歌上搜索了一下,但没有找到来自MSDN的相关内容......如果您知道的话,能否请给我提供一个链接,让我可以下载委托101的示例并阅读它。谢谢。 - Mou

2
delegate string FuncRef(string Val);

FuncRef fValue;   // class member

if (condition1)
    fValue = GetFieldName1;
else if (condition2)
    fValue = GetFieldName2;
else
    fValue = GetFieldName3;

// Another function
fValue("hello");

1
不使用委托,我可以在button_click()中这样做: 如果(condition1) GetFieldName1(); 否则如果(condition2) GetFieldName2(); 否则 GetFieldName3(); 在这种情况下,我可以根据条件调用不同的函数,那么为什么要使用委托来调用函数呢?请回复并告诉我需要通过委托调用函数的确切情况...谢谢。 - Mou

1

微软的 C# 委托教程代码提供了另一个有趣的用例。在他们的示例中,一个名为 Bookstore 的对象具有一个名为 ProcessPaperbackBooks 的方法,该方法接受书籍处理委托并将其应用于类中的每个项。

酷的部分是,如果您需要收集商店中所有书籍的 ISBN 的方法,您不需要更改 Bookstore 类中的任何内容,只需定义一个对书籍进行操作的函数并将其传递到 ProcessPaperbackBooks 方法中即可。委派的好处将发生,并且您的新功能将应用于书店中的每个项目。很漂亮,对吧?

http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx


0

Linq to objects广泛使用委托:

myAnimals.Where(animal => animal.CanSwim)

传递给 Where 方法的参数(animal => animal.CanSwim)是一个 lambda 表达式,它转换为应用于 myAnimals 中所有元素的委托。


0

基本上,任何需要在运行时指定应调用哪个函数的地方都可以使用。

异步BeginInvoke/EndInvoke模式是一个完美的例子;回调通过委托来指定。


0
简而言之:您可以将委托和事件成员组合使用,以便例如将事件处理程序分配给一个在之前不知道它的类中,按钮类知道何时触发单击事件,但尚未知道内部将其绑定到mybutton_Click处理程序。

1
你说的我无法想象,请给一个小例子让我理解你在说什么。 - Mou

0

我使用委托的一个地方是我的输入处理程序(C#,XNA)

我有一个public void OnKeyboardPress()委托,当按下某些键时,我将其绑定到各种函数。

输入是一个很好的例子; 而不是轮询它(即每次更新都会“准备好了吗?”),你等待它来召唤你...例如GUI。 WPF事件就是委托。


你能展示一下使用委托的小样例吗?就是你在这里所说的。 - Mou

0

委托是一等公民对象。也就是说,您可以像任何其他对象一样引用它们、重新分配它们等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接