Может ли порядок инициализации полей класса в VB.NET зависеть от ссылок на другие поля?

Возьмите этот пример кода:

Class Foo
    ReadOnly name As String

    Public Sub New(name As String, dependentUpon As Foo)
        Me.name = name
        Console.Write("{0} created. ", name)
        Console.WriteLine("Dependent upon {0}.", If(dependentUpon IsNot Nothing,
                                                    dependentUpon.Name,
                                                    "nothing"))
    End Sub
End Class

Class Bar
    ReadOnly dependent As New Foo("Dependent", independent)  ' <-- !!!
    ReadOnly independent As New Foo("Independent", Nothing)
End Class

Выход из New Bar() является:

Dependent created. Dependent upon nothing.
Independent created. Dependent upon nothing.

Кажется, что поля инициализируются в том же порядке, в каком они появляются в исходном коде, что (а) приводит к неожиданному результату, и (б) кажется немного озадачивающим, учитывая, что обычно не разрешается читать из неинициализированных переменных в.NET, но это, кажется, работает нормально выше.

Я ожидал бы, что VB.NET будет достаточно умен, чтобы сначала инициализировать ссылочные поля, а затем только те, которые ссылаются на него; то есть я бы хотел увидеть этот вывод вместо этого:

Independent created. Dependent upon nothing.
Dependent created. Dependent upon Independent.

Кто-нибудь знает, как заставить VB.NET вести себя так, а не просто менять порядок объявления dependent а также independent внутри класса Bar?

1 ответ

Решение

Поля всегда инициализируются в порядке их объявления.

Ограничение доступа к неинициализированным переменным применяется только к локальным переменным, а не к полям. (это было бы слишком сложно обеспечить)

Другие вопросы по тегам