Может ли порядок инициализации полей класса в 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 ответ
Поля всегда инициализируются в порядке их объявления.
Ограничение доступа к неинициализированным переменным применяется только к локальным переменным, а не к полям. (это было бы слишком сложно обеспечить)