尽管存在其他限制,为什么可以将部分方法分配给委托?

Kap*_*pol 6 c# partial-methods

我知道标题可能不完全清楚,但我不想让它太久.

在考虑对部分方法的限制时,有一件事让我感到困惑.在我看来,规则是不一致的.你可能知道:

部分方法必须始终具有返回类型void,并且它们不能具有使用out修饰符标记的任何参数.这些限制已到位,因为在运行时,该方法可能不存在,因此您无法将变量初始化为方法可能返回的内容,因为该方法可能不存在.同样,您不能拥有out参数,因为该方法必须初始化它并且该方法可能不存在.[1]

这对我来说听起来很明智.但与此同时:

如果没有实现部分方法声明,则您不能拥有任何尝试创建引用partial方法的委托的代码.同样,原因是该方法在运行时不存在.[1]

起初,所有这些规则似乎遵循相同的编译器逻辑.但是有一点不同.如第二个引文中所述,编译器仅在没有部分方法的方法实现时才发出错误.为什么它不能在其他场景中检查编译时的实现?当使用部分方法时,这将允许更大的灵活性,并且所有规则背后的逻辑将是相同的.

我担心我能得到的唯一答案是"因为它是如何实施的",但也许还有更多的东西呢?

[1] CLR来自C#,第四版

Luc*_*ski 2

部分方法的全部目的是促进生成代码场景的可扩展性,而不影响运行时性能。代码生成器发出部分方法签名,然后发出调用此部分方法的代码。

现在,在编译时,如果未实现该方法,这些调用站点将被完全删除,并且其余代码必须有效。在这方面,引号令人困惑,因为它们谈论的是该方法的“运行时存在” 。这是无稽之谈:一切都在编译时解决。

这就是差异的原因:您首先引用的规则对方法签名施加了限制,而委托规则对方法使用施加了限制。

有关签名的规则可确保您可以以某种方式调用方法,即使方法调用被删除,代码仍保持有效。部分方法的预期用例是99% 的时间都不存在。如果您需要实现它们,那么这不是您应该首先使用的功能。使用抽象方法或类似的方法。

构建方法的委托就像获取指向该方法的指针,如果该方法不存在,则无法执行此操作(好吧,我想您可能会认为编译器此时可以将委托替换为null,但是你不能写,比如说,new Action(null)),但如果该方法确实存在,为了实现者的方便,没有理由禁止它。但代码生成器不应发出创建方法委托的代码。