Существует ли стандартный способ работы загрузчиков классов .NET?

StackOverflow https://stackoverflow.com/questions/6315821

Вопрос

Существует ли стандартный способ работы загрузчиков классов .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 для этой программы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top