Я думаю, что, поскольку вы используете отладчик, вы путаете два разных действия, скомпилировать и выполнить, и два разных типа операторов, декларативный и функциональный.
Когда вы компилируете, декларативный оператор говорит компилятору зарезервировать часть памяти для вашей переменной. Он говорит: «О, вы хотите объявить целое число с именем« wombatCount »; хорошо, я возьму адрес 0x1234 и зарезервирую четыре байта только для вас и наклею на них метку с именем wombatCount». Это происходит во время компиляции задолго до того, как вы запустите свой код. *
Когда вы выполняете код в отладчике, вы запускаете свой код, поэтому он уже знает о каждом байте памяти, зарезервированном для вас. Переменная wombatCount уже связана с четырьмя байтами по адресу 0x1234, поэтому она может немедленно получить доступ и изменить эти данные в любое время, а не только после вашего объявления объявления. Ваша программа не может, конечно, но отладчик может.
Синтаксис языка C # требует, чтобы вы объявляли память перед использованием ее в своем коде, но это только часть определения языка, а не жесткое требование всех компиляторов. Существуют языки, которые вообще не требуют предварительного объявления ваших переменных, и есть даже некоторые древние языки, где вы можете объявлять переменные в любой точке кода, а не только «выше», где вы будете их использовать. Но разработчики языка теперь понимают, что синтаксис языка наиболее важен для понимания человеком и больше не для простоты машинного кодирования или помощи составителям компиляторов, поэтому современные синтаксисы языка обычно создаются, чтобы максимально помочь программистам. Это означает, что все должно быть менее запутанным, поэтому «объявления должны стоять на первом месте» - это общее правило, помогающее вам избежать ошибок.
(* Чтобы быть технически более точным, я считаю, что в .Net метки ассоциируются только во время компиляции со списком указателей, которые будут резервировать память во время выполнения, но байты данных фактически не выделяются, пока вы их не используете Разница внутренняя и не очень важна для вашего понимания. Важным выводом является то, что декларативный оператор объявляет метку заранее, во время компиляции.)