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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top