.net - net - stackify prefix




Warum eine Klasse versiegeln? (7)

Ich würde gern hören, was die Motivation für den Großteil der versiegelten Klassen im .NET-Framework ist. Was ist der Vorteil, eine Klasse zu versiegeln? Ich kann mir nicht vorstellen, wie es nicht sinnvoll ist, die Vererbung zuzulassen, und wahrscheinlich nicht die einzige, die diese Klassen bekämpft.

Also, warum ist das Framework so konzipiert und wäre es keine unwiderrufliche Veränderung, um alles zu entsiegeln? Es muss einen anderen Grund geben, als nur böse zu sein?


Das Versiegeln einer Klasse erleichtert die Verwaltung verfügbarer Ressourcen.


Durch das Versiegeln können Sie kleinere Leistungssteigerungen erzielen. Dies ist in der Welt der JITs und der faulen Pessimisierung weniger wahr als in der Welt von, sagen wir, C ++, aber da .NET nicht so gut ist wie Pessimierung, sind Java-Compiler meistens wegen unterschiedlicher Designphilosophien nützlich. Er teilt dem Compiler mit, dass er direkt virtuelle Methoden aufrufen kann, anstatt sie indirekt über die vtable aufzurufen.

Es ist auch wichtig, wenn Sie eine "geschlossene Welt" für Dinge wie Gleichheitsvergleich wollen. Normalerweise, sobald ich eine virtuelle Methode definiere, wird mir ziemlich viel daran gehindert, einen Begriff des Gleichheitsvergleichs zu definieren, der die Idee wirklich umsetzt. Auf der anderen Seite könnte ich es für eine bestimmte Unterklasse der Klasse mit der virtuellen Methode definieren. Das Versiegeln dieser Klasse stellt sicher, dass Gleichheit wirklich gilt.


Ich fand diesen Satz in MSDN-Dokumentation: "Sealed-Klassen werden in erster Linie verwendet, um Ableitung zu verhindern. Da sie nie als Basisklasse verwendet werden können, können einige Laufzeitoptimierungen den Aufruf versiegelter Klassenmitglieder etwas schneller machen."

Ich weiß nicht, ob die Leistung der einzige Vorteil von versiegelten Klassen ist und persönlich möchte ich auch andere Gründe kennen ...


Klassen sollten entweder für die Vererbung ausgelegt sein oder sie verbieten. Es gibt Kosten für das Design für die Vererbung:

  • Es kann Ihre Implementierung festhalten (Sie müssen angeben, welche Methoden welche anderen Methoden aufrufen, falls ein Benutzer den einen überschreibt, aber nicht den anderen)
  • Es zeigt Ihre Implementierung und nicht nur die Effekte
  • Es bedeutet, dass Sie beim Entwerfen mehr Möglichkeiten berücksichtigen müssen
  • Dinge wie Equals sind in einem Vererbungsbaum schwer zu gestalten
  • Es erfordert mehr Dokumentation
  • Ein unveränderlicher Typ, der unterklassifiziert ist, kann veränderbar werden (ick)

In Item 17 von Effective Java wird darauf näher eingegangen - unabhängig davon, dass es im Kontext von Java geschrieben ist, gilt der Hinweis auch für .NET.

Ich persönlich wünschte, dass Klassen standardmäßig in .NET versiegelt wurden.


Sealed wird verwendet, um das "spröde Basisklassenproblem" zu verhindern. Ich habe einen guten Artikel in MSDN gefunden, der das erklärt.


Um festzustellen, ob eine Klasse, Methode oder Eigenschaft versiegelt werden soll, sollten Sie im Allgemeinen die folgenden zwei Punkte berücksichtigen:

• Die potenziellen Vorteile, die sich daraus für Klassen ergeben, könnten durch die Möglichkeit zur Anpassung Ihrer Klasse steigen.

• Die Möglichkeit, dass Klassen abgeleitet werden, könnte Ihre Klassen so verändern, dass sie nicht mehr korrekt oder wie erwartet funktionieren.


  • Manchmal sind Klassen zu wertvoll und nicht dazu bestimmt, vererbt zu werden.
  • Runtime / Reflection kann bei der Suche nach Typen Vererbungsannahmen über versiegelte Klassen treffen. Ein gutes Beispiel dafür ist: - Es wird empfohlen, Attribute für die Suchlaufgeschwindigkeit zu versiegeln. type.GetCustomAttributes (typeof (MyAttribute)) wird erheblich schneller ausgeführt, wenn MyAttribute versiegelt ist.

Der MSDN-Artikel für dieses Thema beschränkt die Erweiterbarkeit durch Sealing Classes .





design