Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 叶节点类中的Sealed关键字_C#_Optimization - Fatal编程技术网

C# 叶节点类中的Sealed关键字

C# 叶节点类中的Sealed关键字,c#,optimization,C#,Optimization,虽然我知道sealed可以用于安全原因,但有一些人在叶节点上使用sealed关键字作为优化技术 这对优化有什么帮助?为什么编译器不够聪明,不能自己解决这个问题?不,它在优化方面没有真正的帮助。无论如何,这不是我从分析中看到的。不,它在优化方面没有真正的帮助。无论如何,这不是我从分析中看到的。在一个密封的类中,对虚拟方法的调用可以绕过通常的虚拟方法查找,直接转到最派生的虚拟方法实现。原则上,编译器/JIT也可以内联这些调用 编译器无法为非密封类找到它,因为任何代码都可能在编译后出现并从类继承:编译

虽然我知道sealed可以用于安全原因,但有一些人在叶节点上使用sealed关键字作为优化技术


这对优化有什么帮助?为什么编译器不够聪明,不能自己解决这个问题?

不,它在优化方面没有真正的帮助。无论如何,这不是我从分析中看到的。

不,它在优化方面没有真正的帮助。无论如何,这不是我从分析中看到的。

在一个密封的类中,对虚拟方法的调用可以绕过通常的虚拟方法查找,直接转到最派生的虚拟方法实现。原则上,编译器/JIT也可以内联这些调用


编译器无法为非密封类找到它,因为任何代码都可能在编译后出现并从类继承:编译器必须假设最坏的情况。

在密封类中,对虚拟方法的调用可以绕过通常的虚拟方法查找,直接转到最派生的虚拟方法实现。原则上,编译器/JIT也可以内联这些调用


编译器无法为非密封类找到它,因为任何代码都可能在编译后出现并从类继承:编译器必须假设最坏的情况。

假设您有一个在叶类中重写的虚拟方法。这当然不会被进一步重写,因此JIT编译器可能会为已知属于该叶类的目标内联调用该方法。请注意,我不知道JIT是否真的执行了这种优化

请注意,在Java中,HotSpot JVM甚至可以对非最终类执行此优化,因为它是一个多过程JIT:它可以乐观地假设没有任何东西会覆盖虚拟方法,然后如果加载了一个覆盖它的类,就撤消其优化。当然,在Java中,默认情况下方法是虚拟的,这比在C中更重要。即使默认情况不重要,但它们显然是重要的


就我个人而言,我不使用sealed,特别是出于优化或安全原因:我使用sealed是因为正确地设计继承很困难。我同意或禁止为继承而设计的概念,并普遍发现,不能够从类中派生的偶尔痛苦,可以通过不用担心继承而得到补偿。YMMV.

假设您有一个在叶类中重写的虚方法。这当然不会被进一步重写,因此JIT编译器可能会为已知属于该叶类的目标内联调用该方法。请注意,我不知道JIT是否真的执行了这种优化

请注意,在Java中,HotSpot JVM甚至可以对非最终类执行此优化,因为它是一个多过程JIT:它可以乐观地假设没有任何东西会覆盖虚拟方法,然后如果加载了一个覆盖它的类,就撤消其优化。当然,在Java中,默认情况下方法是虚拟的,这比在C中更重要。即使默认情况不重要,但它们显然是重要的


就我个人而言,我不使用sealed,特别是出于优化或安全原因:我使用sealed是因为正确地设计继承很困难。我同意或禁止为继承而设计的概念,并普遍发现,不能够从类中派生的偶尔痛苦,可以通过不用担心继承而得到补偿。YMMV.

这是一个有点虚假的优化;我宁愿使用它来确保如果我不期望继承,我就不会得到继承。编译器仍然以虚拟调用的形式向类发出所有实例调用,但JIT可能会以不同的方式对其进行优化,如果不重写,只需执行null检查和静态调用。可能吧


还有一些更为深奥的情况,例如,特定接口的存在会导致在运行时对其进行不同的处理,但根据不同的情况利用这些情况需要通过ILGenerator等生成运行时代码。

这有点虚假优化;我宁愿使用它来确保如果我不期望继承,我就不会得到继承。编译器仍然以虚拟调用的形式向类发出所有实例调用,但JIT可能会以不同的方式对其进行优化,如果不重写,只需执行null检查和静态调用。可能吧


还有一些更深奥的案例,例如,当特定接口的存在会导致在运行时对其进行不同的处理时,但要利用这些场景(取决于密封),需要通过ILGenerator等生成运行时代码。

可能重复的可能重复我赞成密封一切的想法,除非支持继承,但框架设计指南似乎有问题
ee,这让我有点惊讶,因为在.NET framework中有很多密封的类。我赞成密封一切的想法,除非支持继承,但框架设计指南似乎不同意,这让我有点惊讶,因为在.NET framework中有很多密封的类。有点像。如果在构造后调用对象上的方法而不将其分配给变量,则编译器可以直接调用该方法,而无需虚拟查找。像这样新的非密封类方法;某种程度上。如果在构造后调用对象上的方法而不将其分配给变量,则编译器可以直接调用该方法,而无需虚拟查找。像这样新的非密封类方法;