C# 代表的演变
我试图了解代表的演变。如何才能更好地理解这一点,而不是理解之前发生的事情?我知道委托的概念来自C++中的函数指针。p> 一,。引入函数指针的主要原因是什么?是 它支持多线程吗 :存在委托/函数指针以提供 灵活性水平。方法的选择可以从形式上解耦 它的调用 我已经向各位代表介绍了这个伟大的线程资源 这就是Joe Albahari对异步委托的看法:C# 代表的演变,c#,multithreading,delegates,history,C#,Multithreading,Delegates,History,我试图了解代表的演变。如何才能更好地理解这一点,而不是理解之前发生的事情?我知道委托的概念来自C++中的函数指针。p> 一,。引入函数指针的主要原因是什么?是 它支持多线程吗 :存在委托/函数指针以提供 灵活性水平。方法的选择可以从形式上解耦 它的调用 我已经向各位代表介绍了这个伟大的线程资源 这就是Joe Albahari对异步委托的看法: ThreadPool.QueueUserWorkItem没有提供一种简单的 在线程完成后从线程获取返回值 执行异步委托调用(异步委托 简而言之)解决这个
ThreadPool.QueueUserWorkItem
没有提供一种简单的
在线程完成后从线程获取返回值
执行异步委托调用(异步委托
简而言之)解决这个问题,允许输入任意数量的类型化参数
从两个方向通过。此外,上的未处理异常
异步委托可以方便地在原始委托上重新调用
线程(或者更准确地说,调用EndInvoke
)的线程),等等
它们不需要显式处理
*二,。所有代理本质上都是异步的吗?:委托是指向代码的指针。这也不是天生的 同步或异步;调用它的方式以及 返回的结果确定 :当您有委托实例f时,您可以 同步调用f(),也可以调用异步 f、 BeginInvoke()
*
C#3.5:添加lambda表达式
C#4.0:添加了任务并行库
编辑:我这里的大部分问题都已澄清。如果我能为代表们提供一份“历史”,并为他们提供更多的实际用途,那就太好了 让我们尝试一下: 1) 委托/函数指针的存在提供了一定程度的灵活性。
它们允许方法的选择与其调用分离 2) 当您有一个委托实例
f
时,您可以同步调用f()
或调用异步f.BeginInvoke()
3) 是的,很多。和事件通常是同步调用的
4) 这与理解它们有关吗
1.函数指针的主要用途是支持两件事函数作为其他函数和回调函数的参数,我认为它不是多线程的 2.所有委托本质上都不是异步的,必须与线程一起使用,才能像前面提到的文章那样运行异步 3.一个著名的用法是Lambda表达式和LINQ、回调、启动线程和事件处理
4.我认为委托基本上使用的是函数指针机制函数变量可以追溯到60年代的LISP中。甚至Lambda表达式这个术语也来自于此。整个概念被称为“作为第一类对象的函数”,或者只是“第一类函数”。LISP很有名——人们还在学校学习它,因为它处理第一类函数非常流畅——比函数指针或委托更好。当人们创造新的语言时,他们都知道应该尝试复制的很酷的LISP特性 用于“委托是C#实现一级功能的方式”一句中 <>既然C++试图使用C++语法,为什么它没有使用C++样式的函数指针呢?我认为这是整个不安全指针的问题,而且大多数C#用户都被引导远离使用指针
关键字“delegate”是特定于C的。我最好的猜测是,这是因为委托设计模式(它使用函数指针)。当时模式非常庞大,每个人都希望他们的代码清楚地使用它们。此外,大多数C#用户没有接受过很多正式培训。因此,
delegate
作为关键字是一种聪明的方式,可以说“这就是您需要的delegate模式。”我假设模式受欢迎程度的下降就是为什么较新的(x)=>{return x+1;}
版本的匿名函数会删除该关键字(并使用更通用的术语lambda表达式)委托是指向代码的指针。它本身既不是同步的,也不是异步的;调用它的方式和返回的结果决定了这一点。代理没有意识到这一点。@Jon,谢谢!更新了这个问题。对于第4点:是的,我相信是这样。我想了解一个特定的功能是如何变成今天这样的。如果你能解释一下你关于LINQ和回调函数的观点,它就