2010-03-25 12 views
5

Nehmen wir Folgendes an: Wir haben Klasse B, eine private Klasse, die in Klasse A verschachtelt ist. Es gibt keine Klasse, die von Klasse B erbt. Die Frage ist: wird der Compiler automatisch Klasse B als Sealed markieren? (NonInheritable in VB). Gibt es einen guten Grund dafür, dass der Compiler die Klasse B nicht als versiegelt markiert?Werden private Klassen bei der Kompilierung versiegelt?

Mein Gedankengang ist dies: Da Klasse B innerhalb der Klasse A verschachtelt ist und privat ist und keine andere Klasse von Klasse B erbt, sollte es sicher sein, sie zu versiegeln, da sie nicht außerhalb vererbt werden kann Klasse A (nicht einmal von Unterklassen von A).

Class A 
    Private Class B 
    End Class 
End Class 

Antwort

7

Der Compiler markiert diesen Typ nicht automatisch als versiegelt.

Wahr in diesem sehr spezifischen Szenario gibt es keinen wirklichen Wert beim Verlassen der Klasse als unversiegelt. Es ist jedoch nicht immer so einfach festzustellen, dass Sie sich in diesem Szenario befinden. Sie haben die folgende

  • Der Typ ist privat
  • berücksichtigen muss das Vorhandensein von Teilklassen
  • Andere private verschachtelte Typen erben könnte in Erwägung ziehen.

Diese sind nicht unmöglich zu berechnen, aber es ist auch nicht trivial. Es ist viel billiger, den Benutzer zu bitten, den Typ einfach selbst zu versiegeln

1

Ich habe nicht überprüft, aber ich nehme an, dass es das nicht tun wird. In jedem Fall kann das JIT feststellen, ob eine Klasse Nachkommen haben kann oder nicht, so dass ich zur Laufzeit keinen Unterschied erwarte.

+0

Das JIT kann feststellen, ob eine Klasse Nachkommen hat, aber ich glaube nicht, dass es außerhalb der Anwesenheit des versiegelten Bit auf einem Typ tut. Ich habe keine Referenzen, um mich zu unterstützen, aber ich bin ziemlich sicher in diesem Punkt. – JaredPar

+0

@JaredPar, soweit ich weiß, tun dies schon viele Java VMs (was aufgrund der Default-Virtual-Methode wirklich notwendig ist - http://www.ibm.com/developerworks/library/j- jtp12214 /), und ich bin mir ziemlich sicher, dass MS solche Optimierungen durchführt, wenn sie als leistungsfördernd angesehen werden. – Lucero

+0

@Lucero das JIT ist definitiv für explizit versiegelte Klassen. Aber es gibt nur eine sehr kleine Teilmenge von Fällen, in denen dies für nicht versiegelte Klassen möglich ist. Ich bin mir nicht sicher, ob sich diese Mikrooptimierung lohnt. Aber wie ich schon sagte, ich kann keine Dokumente auf die eine oder andere Weise finden. – JaredPar