2015-11-11 2 views
0

В C# Я знаю, что если я пишу в метод такое заявление:Декларация локальных переменных и значений в режиме отладки

int a; // local variable 

, то я не могу использовать, что до инициализации.

Фактически C# спецификации говорит:

Локальная переменная введена локальной-переменной декларации не автоматически инициализируется и, таким образом, не имеет значения

не по умолчанию, однако, если я бегу Визуальное Studio в режиме отладки показывает, что a имеет значение 0 в качестве значения по умолчанию?

Почему? Может быть, это относительно кода IL. ?

+1

Я попытался несколько раз дать немного подробный ответ, но трудно получить нужный уровень детализации. В общем, ответ Глорина полностью правильный, понятный и короткий. Просто обратите внимание, что то, что вы видите в отладчике, не обязательно происходит, когда происходит * не * отладка - например, в отладчике время жизни локалей привязано к области видимости, в то время как то же самое не применяется за пределами отладчика (например, местные жители имеют право на сбор после их использования в последний раз, вместо того, чтобы ждать завершения «блока»). Это также включает в себя множество различий в обработке и инициализации стека. – Luaan

ответ

4

Тот факт, что вы не можете использовать локальную до явной инициализации, является правилом, встроенным в C# для предотвращения ошибок. Если вы попытаетесь использовать переменную, которой вы не присвоили, это, скорее всего, будет ошибкой.

То, что компилятор фактически инициализирует местные жители их нулевым или нулевым значением, не имеет особого значения. Это не то, что компилятор нуждается в. Наверное, просто то, что было проще для разработчиков компилятора по той или иной причине.

Response для редактирования с спецификацией цитатой:

Я бы сказал, что это по-прежнему соответствует спецификации, поскольку из контекста вашей C# программы вы не можете наблюдать переменные без инициализации. Таким образом, в контексте он не инициализируется. Я очень сомневаюсь, что отладчик действительно должен подчиняться тем же правилам определенного назначения. We с помощью отладчика знает, что при создании он установлен в 0. Но компилятор также знает, что вы ничего не присваивали ему и можете обрабатывать переменную как неинициализированную.

2

Целое не обнуляемый, это значение по умолчанию всегда0

+1

Итак, почему вы не можете получить к нему доступ из кода, когда вы его не инициализируете? – CodeCaster

+0

@CodeCaster вы задаете другой вопрос или это намек на то, что я что-то пропустил в этом? – Jamiec

+0

Я нахожу ваш ответ очень упрощенным, поэтому я задал этот вопрос. Связано: [Почему локальные переменные требуют инициализации, но полей нет?] (Http://stackoverflow.com/questions/30816496/why-do-local-variables-require-initialization-but-fields-do-not). – CodeCaster

2

Что вы Seing это один из «автоматизма» в отношении переменных.

Некоторые переменные, такие как строки, имеют значение NULL, что означает, что они могут иметь значение null в качестве значения и, следовательно, это значение по умолчанию для них, если они не инициализированы.

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

Помните, что с нулевым значением я не имею в виду? переменные типа int? но действительно переменная самого типа, если она может иметь нулевое значение.

«Нельзя использовать до инициализации» является мерой безопасности. Как обычно, когда вы печатаете переменную, которую вы никак не задали, вы получаете полностью нежелательные данные (0 для int, null для других, ...), поэтому вы всегда должны читать только из переменная, когда она была инициализирована каким-то образом. Когда это запрещено, независимо от того, каким способом вы можете видеть это как функцию безопасности.

Редактировать: Чтобы сделать его более понятным, значение «По умолчанию» и «инициализировано», возможно, немного запутывают здесь. Это значит, что у них могло быть ЛЮБОЕ значение, и они просто настроены на то, что им разрешено, и могут представлять недопустимое состояние, такое как null для nullable и другое значение (в данном случае 0) для non-nullable. По сути, эти переменные не инициализируются с этой целью. Они просто, похоже, настроены на значение, находящееся в пределах их диапазона (хотя компилятор считает их еще неинициализированными).

+2

Короче говоря, нет никаких законных оснований для чтения неинициализированного локального, поэтому компилятор запрещает его - это всегда будет ошибкой. Тем не менее, это не говорит о том, что компилятору запрещено инициализировать сам локальный сервер или что отладчик вынужден сказать вам «UNINITIALIZED !!!». – Luaan

+1

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

Смежные вопросы