我精通C#,但我无法理解代表们。
我可以看到它们会很有用,如果你有多个场景,并且可以根据场景将不同的方法附加到委托,但这是我唯一能够理解何时使用它们的方法。为什么不只使用一个功能?
对于像MouseClick这样的事件有意义,等到MouseClick被触发然后转到MouseClick(),但我在代码中不理解它。我理解javascript函数中的函数,我没有找到任何编程方法在C#中这样做,所以是委托方式吗?
我今天已经阅读了大约3篇关于此的博客,并希望有人听到会让我知道一个代表是100%需要的时间,没有别的办法。
答案 0 :(得分:4)
为什么不使用功能?
这基本上就是一个代表。如果需要,您可以将其视为单个方法接口。您可以从现有方法创建委托实例(使用方法组转换),也可以使用匿名函数(lambda表达式或匿名方法)。
我有几篇关于代表的文章:
希望至少有一个能帮到你......(我怀疑最接近的“函数中的函数”等同于lambda表达式。)
答案 1 :(得分:1)
对于您正在查看的一些示例,我可以看到为什么有人会使用委托而不仅仅是直接函数,这让人感到困惑。在这些简单的情况下,您可以轻松地使用基本方法,但委托真的在LINQ中闪耀。代理允许在LINQ中进行复杂查询,同时仍然相对容易编写。
答案 2 :(得分:0)
对某些UI更改的反应并不总是发生事件。假设您有一个后台线程需要在调用另一个函数之前完成。它在这些类型的场景中非常有用,因为它允许您执行跨线程通知等操作。
答案 3 :(得分:0)
有时通过引用熟悉的概念来简化概念有助于我。
将委托视为容器(参见下图):
功能 =适合此容器内的木块。
我们不能直接将函数作为参数传递,但我们可以传递代理!所以基本上我们将木块(函数)放入容器(委托)中,现在我们可以将它作为参数传递并在需要时使用它。
签名 =盖子。这样可以确保我们只能将具有正确形状的块放入容器中。
调用委托 =获取容器中的所有块(函数)和"调用"或者"调用"这些功能。
多播委托是我们将超过1个块放入容器的时候(因此当我们调用多播委托时,将调用其中的所有函数)。
事件只是一个带锁的容器(委托)。这可以防止有人打开盖子倒出里面的所有块。
如果您想更详细地阅读
,可以从我的博客中提取这些抽象Simple explanation to delegates and events
此外,一旦代表和事件有意义,值得查看evolution of the delegate以了解委托如何演变为lambda函数。
我希望这种抽象能够更好地理解代表,它确实帮助了我。
答案 4 :(得分:-2)
您可以使用函数代替委托,但委托可以使您的代码更清晰,更易读(例如,更少的行)。
[]的