Frage

Gibt es eine Standardmethode für .NET -Klasse -Loader zum Arbeiten?

Sagen Sie, ich kompile diesen 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

Kann ich garantieren, dass der kompilierte Code (in allen implementierten Plattformen) die folgende Ausgabe hat?

Main
Init A
A Constructor
Init C
War es hilfreich?

Lösung

Da Sie Konstruktoren verwenden und keine Inline -Initialisierung, markiert der VB -Compiler die Typen nicht mit beforefieldinit, und die Bestellung wird genau kontrolliert.

Wenn Sie jedoch Folgendes geschrieben haben (unter Verwendung der Inline -Initialisierung):

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

Die Bestellung wäre nicht spezifiziert. Die gleiche Reihenfolge wie Ihr ursprünglicher Code wäre erlaubt, aber C kann früher initialisiert werden. In der Tat ist die Ausgabe auf meinem System:

Init A
A Constructor
Init C
Main

Der Grund ist, dass C jetzt ist markiert beforefieldinit.


Unbegründes Nit-Picking: Nein, Ihr ursprünglicher Code ist garantiert nicht garantiert, dass diese Ausgabe ist. Bei einem Release -Build wird es keine Ausgabe haben, weil System.Diagnostics.Debug ist bedingt genannt.

Andere Tipps

Ja, die Reihenfolge der Aufruf von statischen und Instanzkonstruktoren ist Teil der Sprachspezifikation. Alle konformen Compiler sollten das gleiche IL für dieses Programm abgeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top