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由于某种原因被保留,可能需要做太多的工作来删除它.