Gibt es eine Standardmethode für .NET -Klasse -Loader zum Arbeiten?
-
26-10-2019 - |
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
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.