代表的用法

时间:2011-06-16 12:33:55

标签: c# delegates

我看到该委托用于自定义事件。到目前为止

delegate string FuncRef(string Val);

FuncRef fValue = GetFieldName;

fValue("hello");

我在这里做的只是声明委托并为委托分配一个函数名称,并在需要时调用fValue("hello");

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

所以请告诉我除了事件处理之外需要委托使用的场景。请指导我使用示例代码并模拟我需要通过委托调用函数的情况,除了事件处理。请告诉我一些现实生活场景,我们必须通过委托调用函数。

8 个答案:

答案 0 :(得分:5)

使用委托而不是直接调用函数的原因与

的原因相同
var taxRate = 0.15;
var taxAmount = income * taxRate;

而不是

var taxAmount = income * 0.15;

换句话说:使用变量来保存对可调用实体的引用(委托就是这样)允许您编写可以根据传递给它的参数来改变其行为的代码(。这意味着更灵活的代码。

有关使用委托的代码示例,您可以查看LINQ(当然),但也有“委托101”示例与任何语言相关:filtering a list

答案 1 :(得分: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");

答案 2 :(得分:1)

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

很酷的部分是,如果你需要说,一个方法收集商店里所有书籍的所有ISBN,你不需要改变书店类中的任何东西,但只需要定义一个函数作用于书籍并将其传递给ProcessPaperbackBooks方法。委派的善意将会发生,您的新功能将应用于书店的每个项目。时髦,没有?

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

答案 3 :(得分:0)

基本上,您希望能够在运行时指定应调用哪个函数的任何地方。

async BeginInvoke / EndInvoke模式就是一个很好的例子。回调是通过委托指定的。

答案 4 :(得分:0)

很快:您可以组合使用委托和事件成员,例如可以将事件处理程序分配给之前不知道它的类,按钮类知道何时必须触发click事件并且不知道但是,在内部,您将mybutton_Click处理程序绑定到它。

答案 5 :(得分:0)

Linq to objects广泛使用了委托:

myAnimals.Where(animal => animal.CanSwim)

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

答案 6 :(得分:0)

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

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

输入就是一个很好的例子;而不是轮询它(即你每次更新'它准备好了吗?'你等着它给你打电话'......比如GUI。 WPF活动是代表。

答案 7 :(得分:0)

代表是第一类对象。我可以像其他任何对象一样引用它们,重新分配它们等。