2

シールクラスについて読み、シール クラスは継承できないことを知りました。

シールされたクラスから継承する必要がないときにクラスをシールで装飾すると、パフォーマンスが向上しますか?

// cs_sealed_keyword.cs
// Sealed classes
using System;
sealed class MyClass 
{
   public int x; 
   public int y;
}

class MainClass 
{
   public static void Main() 
   {
      MyClass mC = new MyClass(); 
      mC.x = 110;
      mC.y = 150;
      Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y); 
   }
}
4

2 に答える 2

2

昔々、OOの初期には、非仮想メソッドはvtableアクセスを回避することでパフォーマンスに顕著なメリットをもたらしました。ただし、現在では、修飾子の背後にある理論的根拠は、sealedクライアントコードがライブラリとどのように相互作用するかを制御する、設計の選択に関するものです。

privateメソッドにマークを付けると、将来の改善のために実装の詳細を予約できるのと同じように、クラスにマークを付けるsealedと、ライブラリの(怪しげなReflection shenanigansを除いて)ユーザーが予期しない、場合によっては悲惨な場合に、コードをコールグラフに挿入できないことが保証されます。実装を無分別にサブクラス化する方法。

これは、厳密に制御されたクラス構造が単一の侵入者サブクラスによって完全に取り消される可能性があるセキュリティ状況では特に重要です。したがって、System.Security名前空間にはかなりの数の封印されたクラスがあります。

于 2013-03-17T06:36:21.290 に答える
0

封印された修飾子を使用した場合、パフォーマンスの向上はほとんどありません。コンパイラは、最低レベルでマイクロ最適化を行います。

JIT コンパイラは、メソッドを非仮想的に呼び出すことで、より効率的なコードを生成できます

このスレッドもチェックしてください

于 2013-03-17T05:52:58.353 に答える