我看到该委托用于自定义事件。到目前为止
delegate string FuncRef(string Val);
FuncRef fValue = GetFieldName;
fValue("hello");
我在这里做的只是声明委托并为委托分配一个函数名称,并在需要时调用fValue("hello");
。
而不是通过委托调用GetFieldName()
我可以直接调用它。所以我只想知道为什么我应该使用委托调用函数,因为我们可以直接调用函数....通过委托调用任何函数的优点是什么。
所以请告诉我除了事件处理之外需要委托使用的场景。请指导我使用示例代码并模拟我需要通过委托调用函数的情况,除了事件处理。请告诉我一些现实生活场景,我们必须通过委托调用函数。
答案 0 :(得分:5)
使用委托而不是直接调用函数的原因与
的原因相同var taxRate = 0.15;
var taxAmount = income * taxRate;
而不是
var taxAmount = income * 0.15;
换句话说:使用变量来保存对可调用实体的引用(委托就是这样)允许您编写可以根据传递给它的参数来改变其行为的代码(值我们传入的delagate的em>。这意味着更灵活的代码。
有关使用委托的代码示例,您可以查看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)
代表是第一类对象。我可以像其他任何对象一样引用它们,重新分配它们等。