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

2024-02-17

前几天我问过为什么委托是引用类型 https://stackoverflow.com/questions/7905962/why-are-delegates-reference-types,基于我的错误观念,即委托所需的只是两个引用:一个指向对象,一个指向函数。我完全忽略了(不是因为我不知道,只是因为我忘记了),在 .NET 中,委托至少是部分地作为内置实现来支持事件观察者模式 http://en.wikipedia.org/wiki/Observer_pattern,这意味着每个委托通过一个方式支持多个订阅者调用列表.

这让我想到,代表在 .NET 世界中确实扮演着两种不同的角色。一种是简单的函数指针,例如:

Action<string> writeLine = Console.WriteLine;

The other是一个可观察的:

textBox.TextChanged += HandleTextChanged;

调用列表的存在似乎专门用于第二个角色,就像简单的情况一样writeLine上面的例子你通常甚至不think关于订阅者。

真的,在我看来could是两种不同“类型”的委托:“函数指针”类型和“可观察”类型。在我看来,前者可能是一种值类型。

现在,我并不是说这个should就这样吧,如果有可能的话。我确信区分常规委托和多播委托会有很多缺点,例如,如果委托是值类型,装箱的频率可能会很高,可能需要引入新的关键字(multicast?),不可避免的开发人员困惑等等。我真正想知道的是,如果它would从 CLR 的角度来看,有可能有一个可以充当函数指针的值类型。

我想问这个问题的另一种方式是:是System.Delegate,及其调用列表和所有内容,基本上是基本的 CLR 类型;或者它是一个更简单的“函数引用”类型的包装器,而任何 CLR 语言都没有公开该类型?

我对我使用的所有非正式术语表示歉意,这些术语可能会让一些受过良好教育的开发人员感到困惑。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CLR 可以支持“函数指针”值类型吗? 的相关文章

随机推荐