gpt4 book ai didi

.net - CLR 能否支持 "function pointer"值类型?

转载 作者:行者123 更新时间:2023-12-04 01:49:57 26 4
gpt4 key购买 nike

前几天问why delegates are reference types ,基于我的错误观念,即委托(delegate)只需要两个引用:一个指向对象,一个指向函数。我完全忽略了(不是因为我不知道,只是因为我忘记了)在 .NET 中,委托(delegate)至少部分到位以支持事件作为 Observer pattern 的内置实现。 ,这意味着每个委托(delegate)都通过调用列表支持多个订阅者。

这让我想到,委托(delegate)在 .NET 世界中确实扮演着两个不同的角色。一种是不起眼的函数指针,例如:

Action<string> writeLine = Console.WriteLine;

另一个是可观察的:
textBox.TextChanged += HandleTextChanged;

调用列表的存在似乎专门用于第二个角色,例如简单的 writeLine上面的示例您通常甚至不会考虑订阅者。

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

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

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

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

最佳答案

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

关于.net - CLR 能否支持 "function pointer"值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7932215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com