CLR可以支持"函数指针"值类型吗?

Dan*_*Tao 11 .net clr delegates

几天前,我问为什么委托是引用类型,基于我误导的概念,即委托所需要的只是两个引用:一个是对象,一个是函数.我完全忽略了(不是因为我不知道,仅仅是因为我忘了)是在.NET中,代表至少部分地支持事件作为Observer模式的内置实现,这意味着每个代表通过调用列表支持多个订阅者.

这让我想到,代表们在.NET世界中真正扮演两个不同的角色.一个是简单的函数指针,例如:

Action<string> writeLine = Console.WriteLine;
Run Code Online (Sandbox Code Playgroud)

另一个是可观察到的:

textBox.TextChanged += HandleTextChanged;
Run Code Online (Sandbox Code Playgroud)

调用列表的存在似乎仅适用于第二个角色,就像writeLine上面的简单示例一样,您通常甚至不考虑订阅者.

所以真的,在我看来,可能有两种不同的"种类"代表:"函数指针"类型和"可观察"类型.在我看来,前者可能是一种价值类型.

现在,我并不是说这应该是这种情况,如果可能的话.我确信在常规代理和多播代理之间区分会有很多缺点,例如,如果委托是值类型,可能需要引入新的关键字(multicast?),不可避免的开发人员混淆等我真正想知道简单的是,如果它是可能的,从CLR的角度来看,有可能作为一个函数指针的值类型.

我猜这种问题的另一种方式是:是System.Delegate,它的调用列表和所有,基本上是一个基本的CLR类型; 或者它是一个更简单的"函数引用"类型的包装器,它不会被任何CLR语言暴露?

我为我所使用的所有非正式条款道歉,这些条款可能会使一些受过更多教育的开发人员感到困惑.

Han*_*ant 11

在CLR的早期阶段,曾经存在System.Delegate(类似函数指针)和System.MulticastDelegate(类似事件)之间的区别.在.NET 1.0发布之前就已经废弃了,没有办法创建派生自Delegate的委托类型的实例.它没有必要.MulticastDelegate经过优化,只有在有多个订户时才创建其调用列表.System.Delegate由于某种原因被保留,可能需要做太多的工作来删除它.

  • 嗯,很难,它是MulticastDelegate的基类.很难说出一些从未真正存在过的东西. (3认同)