让我的头围绕代表C#

时间:2011-07-28 16:19:44

标签: c# delegates

我精通C#,但我无法理解代表们。

我可以看到它们会很有用,如果你有多个场景,并且可以根据场景将不同的方法附加到委托,但这是我唯一能够理解何时使用它们的方法。为什么不只使用一个功能?

对于像MouseClick这样的事件有意义,等到MouseClick被触发然后转到MouseClick(),但我在代码中不理解它。我理解javascript函数中的函数,我没有找到任何编程方法在C#中这样做,所以是委托方式吗?

我今天已经阅读了大约3篇关于此的博客,并希望有人听到会让我知道一个代表是100%需要的时间,没有别的办法。

5 个答案:

答案 0 :(得分:4)

  

为什么不使用功能?

这基本上就是一个代表。如果需要,您可以将其视为单个方法接口。您可以从现有方法创建委托实例(使用方法组转换),也可以使用匿名函数(lambda表达式或匿名方法)。

我有几篇关于代表的文章:

希望至少有一个能帮到你......(我怀疑最接近的“函数中的函数”等同于lambda表达式。)

答案 1 :(得分:1)

对于您正在查看的一些示例,我可以看到为什么有人会使用委托而不仅仅是直接函数,这让人感到困惑。在这些简单的情况下,您可以轻松地使用基本方法,但委托真的在LINQ中闪耀。代理允许在LINQ中进行复杂查询,同时仍然相对容易编写。

答案 2 :(得分:0)

对某些UI更改的反应并不总是发生事件。假设您有一个后台线程需要在调用另一个函数之前完成。它在这些类型的场景中非常有用,因为它允许您执行跨线程通知等操作。

答案 3 :(得分:0)

有时通过引用熟悉的概念来简化概念有助于我。

委托视为容器(参见下图):

enter image description here

功能 =适合此容器内的木块。

我们不能直接将函数作为参数传递,但我们可以传递代理!所以基本上我们将木块(函数)放入容器(委托)中,现在我们可以将它作为参数传递并在需要时使用它。

签名 =盖子。这样可以确保我们只能将具有正确形状的块放入容器中。

调用委托 =获取容器中的所有块(函数)和"调用"或者"调用"这些功能。

多播委托是我们将超过1个块放入容器的时候(因此当我们调用多播委托时,将调用其中的所有函数)。

事件只是一个带锁的容器(委托)。这可以防止有人打开盖子倒出里面的所有块。

如果您想更详细地阅读

,可以从我的博客中提取这些抽象

Simple explanation to delegates and events

此外,一旦代表和事件有意义,值得查看evolution of the delegate以了解委托如何演变为lambda函数。

我希望这种抽象能够更好地理解代表,它确实帮助了我。

答案 4 :(得分:-2)

您可以使用函数代替委托,但委托可以使您的代码更清晰,更易读(例如,更少的行)。

[]的