Существует ли стандартный способ работы загрузчиков классов .NET?
-
26-10-2019 - |
Вопрос
Существует ли стандартный способ работы загрузчиков классов .NET?
Скажем, я компилирую этот код:
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
Могу ли я гарантировать, что скомпилированный код (на всех реализованных платформах) будет иметь следующий вывод?
Main
Init A
A Constructor
Init C
Решение
Поскольку вы используете конструкторы, а не встроенную инициализацию, компилятор VB не помечает типы значком beforefieldinit
, и порядок точно контролируется.
Однако если вы написали следующее (используя встроенную инициализацию):
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
порядок будет неопределенным.Разрешен тот же порядок, что и исходный код, но C
можно инициализировать раньше.Фактически, в моей системе вывод такой:
Init A
A Constructor
Init C
Main
Причина в том, что C
сейчас отмечен beforefieldinit
.
Беспричинные придирки:Нет, ваш исходный код не гарантированно будет иметь такой вывод.В релизной сборке выходных данных не будет, потому что System.Diagnostics.Debug
называется условно.
Другие советы
Да, порядок вызова статических и конструкторов экземпляра является частью спецификации языка. Все соответствующие компиляторы должны выделять один и тот же IL для этой программы.