Est-il un moyen standard pour les chargeurs de classes .NET au travail?
-
26-10-2019 - |
Question
Y at-il un moyen standard pour les chargeurs de classes .NET au travail?
Dis je compile ce code:
Option Strict On : Option Explicit On
Module Module1
Sub Main()
System.Diagnostics.Debug.WriteLine("Main")
Dim g = C.A
End Sub
End Module
Public Class C
Shared Sub New()
System.Diagnostics.Debug.WriteLine("Init C")
End Sub
Shared Property A As New A
End Class
Public Class A
Shared Sub New()
System.Diagnostics.Debug.WriteLine("Init A")
End Sub
Public Sub New()
System.Diagnostics.Debug.WriteLine("A Constructor")
End Sub
End Class
Puis-je garantir le code compilé (dans toutes les plates-formes mises en œuvre) ont la sortie suivante?
Main
Init A
A Constructor
Init C
La solution
Parce que vous utilisez les constructeurs et pas d'initialisation en ligne, le compilateur VB ne marque pas les types avec beforefieldinit
, et l'ordre est contrôlé exactement.
Si, cependant, vous écrit ce qui suit (en utilisant l'initialisation en ligne):
Option Strict On : Option Explicit On
Module Module1
Sub Main()
System.Console.WriteLine("Main")
Dim g = C.A
End Sub
End Module
Public Class C
Shared Function Narg() As A
Dim alpha As New A
System.Console.WriteLine("Init C")
Return alpha
End Function
Shared Property A As A = Narg()
End Class
Public Class A
Shared Sub New()
System.Console.WriteLine("Init A")
End Sub
Public Sub New()
System.Console.WriteLine("A Constructor")
End Sub
End Class
l'ordre serait non précisé. Le même ordre que votre code d'origine serait autorisé, mais C
peut être initialisé plus tôt. En fait, sur mon système, la sortie est:
Init A
A Constructor
Init C
Main
La raison est que C
est maintenant marqué beforefieldinit
.
Gratuitous tatillons: Non, votre code d'origine n'est pas garanti d'avoir cette sortie. Sur une version release il aura pas de sortie, car System.Diagnostics.Debug
est conditionnellement appelé.
Autres conseils
Oui, l'ordre d'appel des constructeurs statiques et d'instance fait partie de la spécification du langage. Tous les compilateurs conformes doivent émettre le même IL pour ce programme.