2010-07-06 8 views
6

Мой вопрос: могу ли я проверить, была ли инициализирована переменная (строка или int/double type) или массив (строка или int/double type) в C#?Как проверить, инициализирована ли переменная или массив в C#

Заранее спасибо.

+3

Вы получаете противоречивые ответы, потому что ваш вопрос неоднозначен: «инициализированный» может означать разные вещи, в зависимости от того, какую проблему вы пытаетесь решить. – egrunin

+0

Аналогично, слово «переменная» может означать разные вещи.Вы говорите о поле в классе, свойстве или локальной переменной внутри метода? – StriplingWarrior

ответ

6

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

Для локальных переменных они не могут использоваться перед объявлением, поэтому, если вы можете его проверить, он был инициализирован.

+0

Спасибо за сообщение. Однако моя проблема заключается в том, что возможное значение переменной может быть 0, которое будет таким же, как и начальное значение. – Mavershang

+0

@ user208080: Дело в том, что переменная * инициализируется *. Если вы имеете в виду * user-initialized *, то нет, нет способа проверить это, если вы не отслеживаете его самостоятельно. –

+1

Если вы хотите иметь возможность проверить, установлено ли такое значение для таких примитивных типов, как Int32, используйте его тип с нулевым значением. Тогда у вас будет нулевая ссылка, если ваш код не установил ее в другое значение. – HCL

0

Нет. Однако, если это локальная переменная, у вас будет ошибка компилятора. Если это член класса, то он автоматически инициализируется значением по умолчанию (0 для ints, null для объектов и т. Д.)

+0

Если экземпляры создаются динамически, а значение null происходит только в определенных случаях, то компилятор его не забирает. Если вы не включите его в свои тестовые примеры, вы можете получить ошибку. – Roast

+0

@ Лили, что вы говорите о «экземплярах, создаются динамически» и «null только происходит в определенных случаях»? Вы говорите о статических переменных или переменных экземпляра? Что произойдет, если «компилятор не заберет»? Получаете ли вы ошибку времени выполнения, если пытаетесь использовать переменную? – tster

0

языком в щеку, но точный ответ

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

+1

... или вы можете просто попытаться скомпилировать его, так как компилятор сделает это для вас. –

+0

+1 @Adam; имеет смысл. –

+0

Бывают моменты, когда компилятор не обнаружит его, если вы не пройдете каждый путь в своем коде. В этих случаях необходима программная проверка. Например, массив объектов, где не все объекты создаются. Вы выполняете цикл for и вызываете каждый объект ... Вы делаете математику – Roast

1

Попробуйте это,:

If var = NULL Then 
MsgBox ('Not initialized') 
End If 
2

Да вы можете.

Для типов, требующих экземпляров (строка или массивы, как вы просили), вы можете проверить, являются ли они нулевыми.

Вы можете сделать это разными способами, но один путь:

if (myObject == null) 
{ 
    //initialize it here 
} 

типы Примитивный данных не требуется инстансы. Например:

int i;

обыкновение быть равен нулю, то он будет равен 0.

+0

На самом деле вы получите ошибку времени компиляции, если попытаетесь получить к ней доступ ('int i;'), так как C# * требует *, чтобы вы инициализировали все переменные перед их доступом. – Donnie

+0

"неинициализированный" - это * не * то же, что и "non-null". –

1

C# требует, что все переменные быть инициализирована до некоторого значения, прежде чем читать их.

Блочный код:

int i; 
if(i == 0) 
{ 
    // something... 
} 

будет генерировать ошибку времени компиляции, потому что вы пытаетесь получить доступ к значению i перед назначением его. Это также относится к объектам (хотя вы можете инициализировать их до null для начала).

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

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