2011-06-16 72 views
8

我看到委托用于自定义事件。据例如代理的使用

delegate string FuncRef(string Val); 

FuncRef fValue = GetFieldName; 

fValue("hello"); 

我做什么,这里只是申报委托,并指定一个函数名委托,每当需要调用它像fValue("hello");

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

所以请告诉我什么样的场景委托使用是必需的,除了事件处理。请引导示例代码并模拟一种情况,我需要通过委托调用函数,除了事件处理。请告诉我一些真实的场景,我们必须通过委托调用函数。

+1

http://msdn.microsoft.com/en-us/netframework/aa904594 – asawyer 2011-06-16 12:39:57

+0

代表是LINQ to objects的基础部分。如果(条件1) GetFieldName1();如果(条件1) – spender 2011-06-16 12:40:46

回答

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() else if(condition2) GetFieldName2(); else GetFieldName3();在这我可以根据条件调用不同的功能,那么为什么我应该使用委托来调用函数的方式,你说... plzz回复并告诉我什么时候需要通过委托调用函数的确切情况.....谢谢 – Mou 2011-06-16 17:48:08

0

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

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

5

使用,而不是函数直接调用代表的原因是一样的道理,你做

var taxRate = 0.15; 
var taxAmount = income * taxRate; 

,而不是

var taxAmount = income * 0.15; 

换句话说:使用一个变量来保存到一个参考调用实体(委托正是)允许你写的代码,可以根据传递给它的参数改变其行为(价值,我们“再传入delagate的)。这意味着更灵活的代码。

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

+0

msdn没有链接代表101.我搜索谷歌,但没有发现从msdn .....如果你知道可以üplzz给我的MSDN链接从哪里我可以下载代表101例子和可以读取它。谢谢 – Mou 2011-06-16 17:49:06

0

不久:您可以使用委托和事件成员组合能够例如将事件处理程序分配给哪个不知道以前是一类,按钮类知道什么时候它触发点击事件,并且不在内部,你还可以将mybutton_Click处理函数绑定到它。

+1

你说我无法想象。所以你可以提供一个小样本,因为我可以理解你想说什么。 – Mou 2011-06-16 13:40:18

0

LINQ到对象广泛使用代表:

myAnimals.Where(animal => animal.CanSwim) 

供应到哪里方法(animal => animal.CanSwim)的参数是λ表达式转换为被施加到在myAnimals所有元素的委托。

0

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

我有public void OnKeyboardPress()委托,这是我结合各种功能时被按下某些键。

输入是一个很好的例子;而不是轮询它(即你每次更新'它准备好了吗?'等待它给你打电话)..例如GUI。 WPF事件是委托。

+0

你可以向我展示小样本的代表用法吗? – Mou 2011-06-16 17:50:02

1

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

最酷的是,如果你需要说的话,一种方法是收集商店中所有书籍的所有ISBN,你不需要改变书店类中的任何东西,而只需要定义一个函数它作用于书籍并将其传递给ProcessPaperbackBooks方法。委托善良将发生,并且您的新功能将应用于书店中的每个项目。时髦,不?

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

0

代表是第一类对象。 IOW你可以参考他们,重新分配他们,等等,就像任何其他对象一样。