Почему локальные переменные должны иметь начальные значения

Копирование моего ответа с https://stackoverflow.com/a/55704955/5449500

Все еще нет официального подхода запустить IE / EDGE внутри докера как " Нет образов докера Windows с графическим интерфейсом, поэтому мы не можем протестировать IE11, EDGE. "

Но мы можем установить виртуальные коробка и сделать это

Этот подход добавляет дополнительный уровень виртуализации [Вложенность виртуализации] поверх докера, чтобы выполнить IE / Edge, и я думаю, что в ближайшем будущем это может привести к снижению производительности для тяжелых испытаний.

Если тестирование Selenium - это то, что вы ищете, и у вас нет большой нагрузки, вы можете попробовать подход, упомянутый в ссылке.

Youtube - контейнеры Selenium Windows в Docker под Linux

Github - образы Windows

Blogpost - селен на окнах -docker-революция

7
задан 15 April 2009 в 20:09
поделиться

4 ответа

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

ECMA 334v4

§17.4.4 Инициализация поля

Начальное значение поля, будь то это будет статическое поле или экземпляр поле, является значением по умолчанию (§12.2) из тип поля. Это невозможно наблюдать значение поля перед эта инициализация по умолчанию имеет произошло, и поле, таким образом, никогда "Инициализирован".

и

§12. Переменные

... Переменная должна быть определенно назначена (§12.3) до ее значение может быть получено. ...

15
ответ дан 6 December 2019 в 05:43
поделиться

Это на самом деле не должно. Ваша ошибка должна быть во второй строке, а не в первой, и должна быть потому, что вы ИСПОЛЬЗУЛИ ЕГО, прежде чем инициализировали ее.

Компилятор помогает вам здесь.

Так что не инициализируйте их как привычку, вместо этого Вам поможет компилятор!

Приятно, что он проверяет путь для вас. Если у вас есть оператор switch с 3 случаями, в которых каждый устанавливает значение, но вы забыли установить его в своем «значении по умолчанию», но потом использовать его, он предупредит вас, что вы пропустили путь.

Если вы инициализируете переменные равными = 0, вы извлекаете это преимущество.

4
ответ дан 6 December 2019 в 05:43
поделиться

Как указывает Марк, это то, что говорится в спецификации. Причина, по которой это хорошая вещь, заключается в том, что существуют веские причины оставить член неинициализированным, а не локальную переменную, время жизни которой ограничено методом, в котором она находится. В основном вы я бы когда-либо хотел этого только из соображений производительности, если переменная требует больших затрат на инициализацию и должна быть инициализирована только при определенных сценариях использования. Со своей стороны, я бы избегал неинициализированных членов до тех пор, пока моя спина действительно не упиралась в стену!

Для локальных переменных также намного легче определить, все ли пути кода, вероятно, приведут к инициализации, тогда как нет хорошей эвристики, чтобы определить, все ли пути кода во всей программе гарантируют инициализацию перед использованием. Полностью правильный ответ: невозможно в оба случая , как должны знать все студенты CS.

2
ответ дан 6 December 2019 в 05:43
поделиться

Расширяя ответ Марка, инициализация локальной переменной также связана с процессом проверки .
Интерфейс командной строки требует, чтобы в любом проверяемом коде (то есть в модулях, которые явно не запрашивали пропустить процесс проверки с помощью свойства SkipVerfication из атрибута SecurityPermission ), все локальные переменные должны быть инициализированы перед тем, как они использование. В противном случае будет выброшено исключение VerficationException .

Более интересно то, что компилятор автоматически добавляет флаг .locals init для каждого метода, использующего локальные переменные. Этот флаг заставляет JIT-компилятор генерировать код, который инициализирует все локальные переменные значениями по умолчанию. Это означает, что даже если вы уже инициализировали их в своем собственном коде, JIT будет соответствовать флагу .locals init и сгенерировать правильный код инициализации. Эта «повторяющаяся инициализация» не влияет на производительность, поскольку в конфигурациях, допускающих оптимизацию, JIT-компилятор обнаружит дублирование и эффективно обработает его как «мертвый код» (автоматически сгенерированная процедура инициализации не появится в сгенерированных инструкциях ассемблера).

Согласно Microsoft (также поддержанной Эриком Липпертом в ответ на вопрос в его блоге), в большинстве случаев, когда программисты не инициализируют свою локальную переменную, они не делают этого, потому что они передают основную среды, чтобы инициализировать их переменные значениями по умолчанию, но только потому, что они «забыли», таким образом вызывая иногда иллюзорные логические ошибки.
Поэтому, чтобы снизить вероятность появления ошибок такого рода в коде C #, компилятор по-прежнему настаивает на инициализации локальных переменных. Несмотря на то, что он собирается добавить флаг .locals init в сгенерированный код IL.

Более полное объяснение по этому поводу можно найти здесь: За флагом инициализации .locals

12
ответ дан 6 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: