2010-05-28 4 views
7

Просто интересно.Значение неназначенной переменной, не подлежащей обнулению (C#)

Если вы идете:

string myString; 

Его значение равно нулю.

Но если вы идете:

int myInt; 

Каково значение этой переменной в C#?

Благодаря

Дэвид

+2

Простой тест будет достаточно, чтобы вы сами ответили на него. – spender

+4

Я думаю, что качество ответов доказало ценность вопроса. – David

ответ

26

Во-первых, обратите внимание, что это применимо только к полям, а не к локальным переменным - они не могут быть прочитаны до тех пор, пока они не будут назначены, по крайней мере, внутри C#. Фактически CLR инициализирует фреймы стека до 0, если у вас есть соответствующий набор флагов, который, по моему мнению, по умолчанию. Это редко можно наблюдать, но вам нужно пройти через громоздкие хаки.

Значение по умолчанию int равно 0 - и для любого типа это по существу значение, представленное битовым шаблоном, полным нулей. Для типа значения это эквивалент вызова конструктора без параметров, а для ссылочного типа - null.

В основном CLR стирает память с помощью нулей.

Это также значение, заданное default(SomeType) для любого типа.

+1

+1 для обеспечения фоновой механики. – RedFilter

+1

и +1 для различия полей/переменных – Blorgbeard

+0

Когда я написал вопрос, я имел в виду локальную переменную, а не поле, но поскольку я не знал о различии в этом отношении, я не делал этого ясно. Я не знал, что поля int были инициализированы в нуле - спасибо за эту информацию. – David

2

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

1

Значение для унифицированной переменной типа T всегда равно default(T). Для всех ссылочных типов это значение равно null, а для типов значений см. Ссылку, которую @Blorgbeard опубликовал (или написать код для ее проверки).