4

我试图了解代表的演变。与理解它之前发生的事情相比,如何更好地理解这一点?我知道委托的概念来自 C++ 中的函数指针。

1. 引入函数指针的主要原因是什么?是不是支持多线程?

Henk Holterman:委托/函数指针的存在是为了提供一定程度的灵活性。方法的选择可以与其调用分离。

在查看这个出色的线程资源时,我被介绍给了代表

http://www.albahari.com/threading/

这就是 Joe Albahari 对异步委托的看法:

ThreadPool.QueueUserWorkItem没有提供一种简单的机制来在线程完成执行后从线程取回返回值。异步委托调用(简称异步委托)解决了这个问题,允许双向传递任意数量的类型化参数。此外,异步委托上的未处理异常可以方便地在原始线程(或更准确地说,调用 的线程EndInvoke)上重新抛出,因此它们不需要显式处理。

*2。所有代表本质上都是异步的吗?

Jon:委托是一个指向代码的指针。它本质上不是同步或异步的;调用它的方式和返回的结果决定了这一点。

Henk Holterman:当你有一个委托实例 f 你可以同步调用 f() 或者你可以调用异步 f.BeginInvoke()

  1. 除了事件之外,异步委托还有其他用途吗?

dasblinkenlight:委托在异步 API 中有很多用途,例如.NET 异步 I/O

  1. C# 中的委托/线程支持在各个版本中是如何演变的?
    *

dasblinkenlight : 对委托的核心支持保持不变,但该语言添加了许多重要的特性,以便更方便地定义委托。

C# 2.0:引入匿名委托
C# 3.5:添加了 lambda 表达式
C# 4.0:添加了任务并行库。

编辑:我在这里的大部分查询都已得到澄清。如果我能获得代表的“历史”并为他们提供更实际的用法,那就太好了!

4

4 回答 4

4

让我们尝试几个:

1) 存在委托/函数指针以提供一定程度的灵活性。
它们允许方法的选择与其调用分离。

2)当您有委托实例f时,您可以同步调用 f(),也可以调用异步f.BeginInvoke()

3)是的,很多。并且事件通常是同步调用的。

4)这与理解它们相关吗?

于 2012-09-18T11:51:07.077 回答
4
  1. 引入委托的主要原因是提供一种操作可执行代码片段的机制:存储指向它的指针、传递给函数、组织数据结构等等。

  2. 与所有函数调用一样,调用单个委托是同步的,即调用者必须等待委托完成才能取回控制权。但是,您可以通过传递一段可以在以后(异步)存储和执行的代码来使用委托来实现异步 API。

  3. 异步 API 中有很多使用委托,例如.NET 异步 I/O

  4. 委托的核心支持保持不变,但该语言添加了许多重要的特性,使定义委托更加方便。例如,C#2.0 添加了匿名委托,C#3.5 添加了 lambda。

于 2012-09-18T11:53:19.487 回答
1

函数变量来自 60 年代的 LISP。甚至 Lambda 表达式这个术语也来自那里。整个概念被称为“作为第一类对象的函数”或简称为“第一类函数”。LISP 很有名——人们仍在学校学习它,因为它处理 1st-class 函数非常顺利——比函数指针或委托更好。当人们创造新的语言时,他们都知道应该尝试复制那个很酷的 LISP 功能。

用在一句话“委托是 C# 实现第一类函数的方式”中。

既然 C# 尝试使用 C++ 语法,为什么不使用 C++ 风格的函数指针呢?我认为这是整个不安全指针的事情,并且大多数 C# 用户都被引导远离使用指针。

关键字“delegate”是特定于 C# 的。我最好的猜测是因为委托设计模式(它使用函数指针)。当时的模式非常庞大,每个人都希望他们的代码清楚地使用它们。此外,大多数 C# 用户都没有接受过大量的正式培训。因此delegate,作为关键字是一种巧妙的方式,可以说“这是您对委托模式所需要的东西”。我认为 Patterns 的流行度下降是新(x)=>{return x+1;}版本的匿名函数删除该关键字的原因(并使用更通用的术语,lambda 表达式。)

于 2017-02-28T02:26:39.617 回答
0

1.函数指针的主要用途是支持两个函数作为其他函数和回调函数的参数,我认为它不是多线程的。

2.所有委托本质上不是异步的,必须与线程一起使用才能运行异步,如上述文章中所述

3.著名的用法之一是在 Lambda 表达式和 LINQ、回调、启动线程和事件处理中

4.我认为基本上委托是使用函数指针机制

于 2012-09-18T12:01:55.737 回答