После отладки особенно сложной проблемы в VB.NET, связанной с порядком инициализации переменных экземпляра, я обнаружил, что существует существенное несоответствие между поведением, которое я ожидал от C #, и фактическим поведением в VB.NET.
Примечание: Этот вопрос касается небольшого расхождения в поведении VB.NET и C #. Если вы фанат языка, который не может дать ответ, отличный от ", поэтому вам следует использовать C #, noob" , вам нечего здесь видеть; любезно двигаться вперед.
В частности, я ожидал поведения, описанного в C # Language Specification (выделение добавлено):
Когда конструктор экземпляра не имеет инициализатора конструктора или у него есть инициализатор конструктора в форме base(...)
, этот конструктор неявно выполняет инициализации, указанные переменными-инициализаторами полей экземпляра, объявленных в его классе. Это соответствует последовательности присваиваний, которые выполняются сразу после входа в конструктор и до неявного вызова конструктора прямого базового класса. Инициализаторы переменных выполняются в текстовом порядке, в котором они появляются в классе декларация.
Сравните это с частью Спецификации языка VB.NET, касающейся Конструкторов экземпляров , которая гласит (выделение добавлено):
Когда первый оператор конструктора имеет форму MyBase.New(...)
, конструктор неявно выполняет инициализации, заданные инициализаторами переменных переменных экземпляра, объявленных в типе. Это соответствует последовательности назначений, которые выполняются сразу после вызова прямого конструктора базового типа. Такое упорядочение гарантирует, что все переменные базового экземпляра инициализируются инициализаторами своих переменных до выполнения любых операторов, имеющих доступ к экземпляру. .
Несоответствие здесь сразу очевидно. C # инициализирует переменные уровня класса до вызова базового конструктора. VB.NET делает в точности наоборот, по-видимому, предпочитая вызывать базовый конструктор перед установкой значений полей экземпляра.
Если вы хотите увидеть какой-то код, этот связанный вопрос предоставляет более конкретный пример расходящегося поведения. К сожалению, он не дает никаких подсказок относительно того, как можно заставить VB.NET следовать модели, установленной C #.
Меня меньше интересует, почему разработчики двух языков выбрали такие расходящиеся подходы, чем я в возможных обходных путях решения проблемы. В конечном счете, мой вопрос заключается в следующем: Есть ли способ, которым я могу написать или структурировать свой код в VB.NET, чтобы принудительно инициализировать переменные экземпляра до , конструктор базового типа называется, как стандартное поведение в C #?