¿Existe una forma estándar para que funcionen los cargadores de clase .NET?
-
26-10-2019 - |
Pregunta
¿Existe una forma estándar para que funcionen los cargadores de clase .NET?
Digamos que compilé este código:
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
¿Puedo garantizar que el código compilado (en todas las plataformas implementadas) tendrá la siguiente salida?
Main
Init A
A Constructor
Init C
Solución
Debido a que está utilizando constructores y no una inicialización en línea, el compilador VB no marca los tipos con beforefieldinit
, y el pedido está exactamente controlado.
Sin embargo, si escribió lo siguiente (usando inicialización en línea):
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
El pedido no se especificaría. Se permitiría el mismo pedido que su código original, pero C
se puede inicializar anteriormente. De hecho, en mi sistema la salida es:
Init A
A Constructor
Init C
Main
La razón es que C
ahora está marcado beforefieldinit
.
Picking gratuito: no, no se garantiza que su código original tenga esa salida. En una versión de lanzamiento no tendrá salida, porque System.Diagnostics.Debug
se llama condicionalmente.
Otros consejos
Sí, el orden de llamar a los constructores estáticos y de instancia es parte de la especificación del lenguaje. Todos los compiladores conformes deben emitir la misma IL para este programa.