Ich würde gerne hören, was die Motivation für den Großteil der versiegelten Klassen im .Net-Framework ist. Was ist der Vorteil der Versiegelung einer Klasse? Ich kann mir nicht vorstellen, wie nützlich es sein kann, keine Vererbung zuzulassen, und höchstwahrscheinlich nicht der einzige, der gegen diese Klassen kämpft.
Warum ist das Framework so konzipiert und wäre es nicht eine bahnbrechende Veränderung, alles zu entsiegeln? Es muss einen anderen Grund geben, als nur böse zu sein?
.net
performance
mmiika
quelle
quelle
Antworten:
Der MSDN-Artikel zu diesem Thema lautet " Einschränken der Erweiterbarkeit durch Versiegeln von Klassen" .
quelle
Klassen sollten entweder für die Vererbung ausgelegt sein oder sie verbieten. Das Entwerfen für die Vererbung ist mit Kosten verbunden:
Punkt 17 von Effective Java geht näher darauf ein - unabhängig davon, dass es im Kontext von Java geschrieben wurde, gilt der Rat auch für .NET.
Persönlich wünschte ich, Klassen wären in .NET standardmäßig versiegelt.
quelle
Es scheint, dass sich die offiziellen Microsoft-Richtlinien zum Versiegeln weiterentwickelt haben, seit diese Frage vor ~ 9 Jahren gestellt wurde, und sie von einer Opt-In-Philosophie (standardmäßig versiegeln) zu einem Opt-out (standardmäßig nicht versiegeln) übergegangen sind:
Wenn Sie die ASP.Net Core-Codebasis durchsuchen , werden Sie nur etwa 30 Vorkommen finden
sealed class
, von denen die meisten Attribute und Testklassen sind.Ich denke, dass die Erhaltung der Unveränderlichkeit ein gutes Argument für die Versiegelung ist.
quelle
Ich habe diesen Satz in der msdn-Dokumentation gefunden: "Versiegelte Klassen werden hauptsächlich verwendet, um eine Ableitung zu verhindern. Da sie niemals als Basisklasse verwendet werden können, können einige Laufzeitoptimierungen das Aufrufen versiegelter Klassenmitglieder etwas beschleunigen."
Ich weiß nicht, ob die Leistung der einzige Vorteil von versiegelten Klassen ist und ich persönlich würde auch gerne andere Gründe wissen ...
quelle
Die Leistung ist ein wichtiger Faktor, zum Beispiel ist die String-Klasse in Java endgültig (<- versiegelt) und der Grund dafür ist nur die Leistung. Ich denke, ein weiterer wichtiger Punkt ist die Vermeidung des hier im Detail beschriebenen Problems der spröden Basisklasse: http://blogs.msdn.com/ericlippert/archive/2004/01/07/virtual-methods-and-brittle-base-classes. aspx
Wenn Sie ein Framework bereitstellen, ist es wichtig, dass ältere Projekte gewartet werden können und dass Ihr Framework aktualisiert wird, um das Problem der spröden Basisklasse zu vermeiden
quelle
String
Klasse möglicherweise nicht einmal in eine Unterklasse eingeteilt werden, selbst wenn sie nicht endgültig wäre.Versiegelt wird verwendet, um das "Problem der spröden Basisklasse" zu verhindern. Ich habe in MSDN einen guten Artikel gefunden , der das erklärt.
quelle
Durch das Versiegeln können Sie einige geringfügige Leistungssteigerungen erzielen. Dies trifft in der Welt der JITs und der faulen Pessimisierung weniger zu als in der Welt von beispielsweise C ++. Da .NET jedoch nicht so gut wie die Pessimisierung ist, wie Java-Compiler hauptsächlich aufgrund unterschiedlicher Designphilosophien, ist es dennoch nützlich. Es teilt dem Compiler mit, dass er alle virtuellen Methoden direkt aufrufen kann, anstatt sie indirekt über die vtable aufzurufen.
Es ist auch wichtig, wenn Sie eine „geschlossene Welt“ für Dinge wie den Gleichstellungsvergleich wollen. Normalerweise bin ich, sobald ich eine virtuelle Methode definiert habe, ziemlich fertig damit, einen Begriff des Gleichheitsvergleichs zu definieren, der die Idee wirklich umsetzt. Andererseits kann ich es möglicherweise mit der virtuellen Methode für eine bestimmte Unterklasse der Klasse definieren. Das Versiegeln dieser Klasse stellt sicher, dass Gleichheit wirklich gilt.
quelle
Das Versiegeln einer Klasse erleichtert die Verwaltung verfügbarer Ressourcen.
quelle
Um zu bestimmen, ob eine Klasse, Methode oder Eigenschaft versiegelt werden soll, sollten Sie im Allgemeinen die folgenden zwei Punkte berücksichtigen:
• Die potenziellen Vorteile, die das Ableiten von Klassen durch die Möglichkeit zur Anpassung Ihrer Klasse erhalten kann.
• Das Potenzial, dass das Ableiten von Klassen Ihre Klassen so ändern kann, dass sie nicht mehr richtig oder wie erwartet funktionieren.
quelle
Eine weitere Überlegung ist, dass versiegelte Klassen in Ihren Unit-Tests nicht gestoppt werden können. Aus der Microsoft-Dokumentation :
quelle