我试图了解代表的演变。如何才能理解这一点,而不是通过了解它之前的内容?我知道委托的概念来自C ++中的函数指针。
1。引入函数指针的主要原因是什么?是 它支持多线程?
Henk Holterman:存在代理/函数指针以提供a 灵活程度。方法的选择可以是解耦形式 它的调用。
在查看这个优秀的线程资源时,我已经向代表介绍了
http://www.albahari.com/threading/
这就是Joe Albahari对异步委托的看法:
ThreadPool.QueueUserWorkItem
没有提供简单的机制 完成后从线程返回返回值 执行。 异步委托调用(异步委托 简而言之,解决这个问题,允许任意数量的类型化参数 两个方向都过去了。此外,未处理的例外 异步委托可以方便地在原始代理上重新抛出 线程(或更准确地说,调用EndInvoke
的线程),等等 他们不需要明确处理。
* 2。所有代表都是异步的吗?
Jon:委托是指向代码的指针。它本身也不是 同步或异步;它的调用方式和方式 返回的结果确定了。
Henk Holterman:当你有一个委托实例时,你可以 同步调用f()或者你可以调用异步 f.BeginInvoke()
dasblinkenlight:异步中委托的使用很多 API,例如.NET Asynchronous I/O。
dasblinkenlight:代表们的核心支持保持不变, 但该语言增加了许多重要功能,使其更多 方便定义代表。
C#2.0:匿名代表介绍
C#3.5:添加了lambda表达式
C#4.0:添加了任务并行库。
编辑:我的大部分疑问都已澄清过了。如果我能为代表们获得“历史”并为他们提供更实用的用法,那就太棒了!
答案 0 :(得分:4)
我们试试几个:
1)存在委托/功能指针以提供一定程度的灵活性 它们允许选择方法与其调用分离。
2)当你有一个委托实例f
时,你可以同步调用f()
,或者你可以调用异步f.BeginInvoke()
3)是的,很多。并且通常会同步调用事件。
4)这与理解它们有关吗?
答案 1 :(得分:4)
引入委托的主要原因是提供一种机制来处理可执行代码的片段:存储指向它的指针,传递给函数,组织数据结构等等。
与所有函数调用一样,调用单个委托是同步的,因为调用者必须等待委托完成才能获得控制权。但是,您可以通过传递一段代码来实现异步API,这些代码可以在以后(异步)存储和执行。
异步API中委托的用法很多,例如.NET Asynchronous I/O。
代表的核心支持保持不变,但该语言添加了许多重要功能,以便更方便地定义代理。例如,C#2.0添加了匿名委托,C#3.5添加了lambda。
答案 2 :(得分:1)
功能变量来自于LISP中的60年代。甚至连Lambda Expression这个术语都来自那里。整个概念被称为"作为第一类对象,"或只是"一流的功能。" LISP很有名 - 人们仍然在学校学习它,因为它能够如此顺利地处理一流的功能 - 比功能指针或代表更好。当人们制作新语言时,他们都知道他们应该尝试复制的那种很酷的LISP功能。
用于句子"委托是C#实现第一类功能的方式。"
由于C#尝试使用C ++语法,为什么它不使用C ++风格的函数指针?我认为它是整个不安全指针的事情,而且大多数C#用户都无法使用指针。
关键字"委托"是C#特有的。我最好的猜测是因为委托设计模式(使用函数指针)。当时模式是 huge ,每个人都希望他们的代码清楚地使用它们。此外,大多数C#用户都没有接受过很多正式培训。因此,delegate
作为关键字是一种聪明的方式来表达"这是代表模式所需要的。"我假设模式的流行度下降是为什么较新的(x)=>{return x+1;}
版本的匿名函数会删除该关键字(并使用更通用的术语,lambda表达式。)
答案 3 :(得分:0)
1.主要使用函数指针是为了支持两个函数作为其他函数和回调函数的参数,我认为它不是多线程的。
2.所有委托本质上都不是异步的,必须与Thread一起使用,以便像上述文章一样运行异步
3.着名用法之一是Lambda表达式和LINQ,回调,启动线程和事件处理
4.我认为基本上委托是使用函数指针机制