Мой вопрос: могу ли я проверить, была ли инициализирована переменная (строка или int/double type) или массив (строка или int/double type) в C#?Как проверить, инициализирована ли переменная или массив в C#
Заранее спасибо.
Мой вопрос: могу ли я проверить, была ли инициализирована переменная (строка или int/double type) или массив (строка или int/double type) в C#?Как проверить, инициализирована ли переменная или массив в C#
Заранее спасибо.
Вы гарантированы некоторая вид инициализации. Для любых статических элементов или экземпляров все переменные автоматически инициализируются, когда тип или экземпляр строятся, явно или неявно (в этом случае default(Type)
- это значение, поэтому 0 для числовых типов, null
для строк и других ссылочных типов и т. Д.). ,
Для локальных переменных они не могут использоваться перед объявлением, поэтому, если вы можете его проверить, он был инициализирован.
Спасибо за сообщение. Однако моя проблема заключается в том, что возможное значение переменной может быть 0, которое будет таким же, как и начальное значение. – Mavershang
@ user208080: Дело в том, что переменная * инициализируется *. Если вы имеете в виду * user-initialized *, то нет, нет способа проверить это, если вы не отслеживаете его самостоятельно. –
Если вы хотите иметь возможность проверить, установлено ли такое значение для таких примитивных типов, как Int32, используйте его тип с нулевым значением. Тогда у вас будет нулевая ссылка, если ваш код не установил ее в другое значение. – HCL
Нет. Однако, если это локальная переменная, у вас будет ошибка компилятора. Если это член класса, то он автоматически инициализируется значением по умолчанию (0 для ints, null для объектов и т. Д.)
Если экземпляры создаются динамически, а значение null происходит только в определенных случаях, то компилятор его не забирает. Если вы не включите его в свои тестовые примеры, вы можете получить ошибку. – Roast
@ Лили, что вы говорите о «экземплярах, создаются динамически» и «null только происходит в определенных случаях»? Вы говорите о статических переменных или переменных экземпляра? Что произойдет, если «компилятор не заберет»? Получаете ли вы ошибку времени выполнения, если пытаетесь использовать переменную? – tster
языком в щеку, но точный ответ
Сканирование исходного кода и найти все обычаи и декларации переменной, чтобы убедиться, что она инициализируется либо в объявлении, либо где-то гарантировано, прежде чем использовать его.
... или вы можете просто попытаться скомпилировать его, так как компилятор сделает это для вас. –
+1 @Adam; имеет смысл. –
Бывают моменты, когда компилятор не обнаружит его, если вы не пройдете каждый путь в своем коде. В этих случаях необходима программная проверка. Например, массив объектов, где не все объекты создаются. Вы выполняете цикл for и вызываете каждый объект ... Вы делаете математику – Roast
Попробуйте это,:
If var = NULL Then
MsgBox ('Not initialized')
End If
Да вы можете.
Для типов, требующих экземпляров (строка или массивы, как вы просили), вы можете проверить, являются ли они нулевыми.
Вы можете сделать это разными способами, но один путь:
if (myObject == null)
{
//initialize it here
}
типы Примитивный данных не требуется инстансы. Например:
int i;
обыкновение быть равен нулю, то он будет равен 0.
На самом деле вы получите ошибку времени компиляции, если попытаетесь получить к ней доступ ('int i;'), так как C# * требует *, чтобы вы инициализировали все переменные перед их доступом. – Donnie
"неинициализированный" - это * не * то же, что и "non-null". –
C# требует, что все переменные быть инициализирована до некоторого значения, прежде чем читать их.
Блочный код:
int i;
if(i == 0)
{
// something...
}
будет генерировать ошибку времени компиляции, потому что вы пытаетесь получить доступ к значению i
перед назначением его. Это также относится к объектам (хотя вы можете инициализировать их до null
для начала).
Если вы хотите знать, были ли вы изменены с вашего первоначального назначения, то нет, нет никакого способа сообщить это напрямую, если первоначальное присвоение не относится к таинственному значению, которое не будет повторяться последующим присваиванием. Если это не так, вам понадобится дополнительный bool
для отслеживания.
Вы получаете противоречивые ответы, потому что ваш вопрос неоднозначен: «инициализированный» может означать разные вещи, в зависимости от того, какую проблему вы пытаетесь решить. – egrunin
Аналогично, слово «переменная» может означать разные вещи.Вы говорите о поле в классе, свойстве или локальной переменной внутри метода? – StriplingWarrior