Как обнулить переменную c
Перейти к содержимому

Как обнулить переменную c

Как: сбросить переменную в C #?

Это действительно забавно, но мне не удалось найти ответ самостоятельно. Как я могу сбросить переменную? Например. PHP имеет функцию unset ($ var).

9 ответов

На самом деле нет эквивалента «unset».

Самое близкое совпадение, которое я знаю, это использование ключевое слово по умолчанию .

Переменная все равно будет «установлена», но у нее будет значение по умолчанию.

Ты не можешь. Там нет понятия «сброс» переменной. Вы можете установить для него другое значение — 0, ноль, что угодно. Экземплярные /статические переменные даже не имеют понятия о том, установлена ​​или не установлена ​​переменная, а локальные переменные имеют только «однозначно назначенный» или «не определенно назначенный».

Чего ты хочешь достичь?

Как правило, установка его в null делает работу (для переменных типов, таких как int, вы должны сделать его недействительной версией int?).

Если вы хотите использовать переменную только в течение короткого промежутка времени в более крупной функции, вы можете использовать ее, например, так:

Переменная будет действовать только до закрывающей скобки.

Если они не соответствуют вашим обстоятельствам, то можете ли вы уточнить, где вам нужно это сделать.

Может быть, вы хотите освободить объект , на который ссылается переменная:

Переменные типа значения не нужно сбрасывать. Они постоянно выделены.

Для переменных ссылочного типа вы просто устанавливаете для них значение null , и сборщик мусора уничтожает связанный объект (и освобождает память). Но обратите внимание, что сама переменная будет продолжать существовать во всей своей области (блок кода, метод, жизнь объекта, . )

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

Изменить . Как отмечалось в комментариях, я не упомянул, что сборщик мусора не запустит сборку немедленно. Обычно это происходит, когда фреймворк пытается выделить память и не может найти достаточно свободного места. Можно запустить сборку мусора «вручную», но это нежелательно и может ухудшить поведение программы. Для большинства целей поведения GC по умолчанию должно быть достаточно.

Чтобы удалить переменную среды, используйте тот же метод Environment.SetEnvironmentVariable, но передайте значение null или string.Empty в качестве значения = vs.110) .aspx» rel =» nofollow «> http://msdn.microsoft.com/en-us/library/96xafkes (v = vs.110) .aspx

«Если значение пустое и переменная среды, названная переменной, существует, переменная среды удаляется.»

Для объекта вы можете установить его в null, для строки лучше всего установить String.Empty, или вы можете объявить переменную как nullable, например:

Вы можете определить область для этой переменной. После выхода из области переменная больше не будет определяться:

лично я просто иду

variable = Nothing

это, кажется, освобождает ресурсы, особенно при работе с мобильными телефонами!

Обнуляемый тип

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

NULLы особенно уместны при работе с собственными объектами и строками. С другой стороны, имея дело с числами, например, целыми, вы увидите, что они всегда имеют значение (по умолчанию). Для целого числа таким подразумеваемым / резервным значением является 0 (ноль), которое никогда не следует путать с NULL — они совсем не одно и то же, даже если некоторые нестатически типизированные языки программирования могут интерпретировать их одинаково. 0 — это число, NULL — ничего .

Таким образом, если вы когда-нибудь обнаружите, что хотите иметь число, представляющее неопределенное/нулевое значение, вы можете застрять, потому что вы не можете присвоить null целочисленной переменной. Если, конечно, это целое число не определено как nullable-специальная языковая конструкция, созданная для подобных ситуаций. Значение NULL переменной определяется, вопросительным постфиксным типом. Вот пример, иллюстрирующий разницу:

Это справедливо для всех так называемых типами значений, такие как целые числа, floats, bools и structs. С другой стороны, строки и объекты являются ссылочными типами и не могут быть объявлены как допускающие обнуляемое значение, поскольку по умолчанию они по умолчанию нулевые.

Проверка обнуляемого значения на ноль

Итак, теперь, когда вы определили переменную, которая может быть null, проверяется, является ли это случай действительно важным. Вы можете сделать это двумя способами: просто сравните переменную с нулевым ключевым значением, как и для любых других типов, или используйте свойство HasValue, которое объект, допускающий значение NULL, наследует от System.Nullable struct. Вот пример:

Результат тот же, поэтому используйте любой метод, который вы найдете наиболее читаемым и легким для понимания. Поскольку наше значение теперь может быть null, вы должны всегда проверять перед его использованием — в противном случае вы можете столкнуться с исключением.

Использование нулевого значения

От System.Nullable a обнуляемые объекты наследуют также свойство Значение. Оно может использоваться для получения реального значения обнуляемого объекта. Однако для простых операций сравнения, например, используя операторы == и the !=, However, for simple comparison operations, e.g. using the == and the != operators, C# позволяет опустить свойство Значение и просто сравнить объект, допускающий значение NULL. Другими словами, оба этих примера выполняют одну и ту же задачу:

Объекты, допускающие значение NULL, всегда берутся из базового типа данных, например целого числа, как в предыдущих примерах. Хотя эти типы данных могут иметь значение по умолчанию, значение по умолчанию nullable всегда равно null. Поэтому перед использованием значения необходимо проверить наличие ссылок null, как описано выше. Однако Тип, допускающий значение NULL, наследует очень хороший вспомогательный метод, который можно использовать: GetValueOrDefault (). Он возвращает значение объекта, допускающего значение NULL, если это значение NULL, в этом случае он будет возвращать значение по умолчанию базового типа. Так, для нулевых целое число, она возвращает 0, для логическое значение NULL, что будет возвращать false и так далее. Это позволяет обрабатывать как проверку, так и извлечение значения в одной инструкции:

Как вы можете видеть, последний пример короче и легче читать, выполняя то же самое.

Резюме

Типы значений в C#, такие как целые числа и логические значения, всегда имеют значение по умолчанию. Если вы хотите обойти эту проблему, например, потому что нужно различать между 0 и NULL, или потому, что вы должны знать, выбрал ли пользователь намеренно «false» для чего-то, или если переменная имеет только значение по умолчанию false, затем можно присвоить переменной значение NULL постфиксным типом с ? (вопросительный знак).

Как сбросить все переменные в C ++?

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

Проблема в том, что я понятия не имею, как сбросить переменные и
Я предполагаю, что это становится необходимым с более сложным кодом. Помогите?

Это погодное задание в основном «спросить пользователя, какой это месяц,
затем запросите минимальную температуру, максимальную температуру. & количество осадков за каждый день этого месяца,
затем выведите среднемесячные значения и общее количество осадков.

РЕДАКТИРОВАТЬ:
Я получаю некоторые отзывы об отсутствии инициализации (я предполагаю, что это означает определение переменных). Я пытался этого не делать. Мой проф. попросил нас «использовать как можно больше const и« жестко закодированные »переменные минимально.
Я не смог найти здесь никакого использования const, поэтому я компенсировал это минимальной «жесткой записью», надеюсь, он говорил об инициализации.

Решение

Ваш код почти правильный.
Переменные будут удалены и перераспределены, потому что они находятся внутри внутренней области видимости.

Что вы ошиблись, так это то, что вы их не инициализируете. Когда вы объявляете примитивный тип, как int вы просто получаете следующие 4 байта в стеке, так что он будет содержать все, что там есть.

Это обычно плохо, потому что иногда вы предполагаете, что оно будет равно 0. Поэтому, чтобы исправить ваш код, просто убедитесь, что вы инициализируете все переменные явно (присвойте им 0).

Другие решения

Вы уже сбрасываете переменные для вас благодаря семантике значений в C ++. В вашем цикле while у вас есть

Когда вы достигнете конца цикла while ( > ) все эти переменные выйдут из области видимости. Затем, когда вы снова запустите цикл, они будут воссозданы и снова вернутся к своим начальным значениям.

Ты используешь mmNedbor , maxTemp а также minTemp в вашем цикле for, прежде чем инициализировать их, который неопределенное поведение поэтому вы должны установить для них начальное значение по умолчанию.

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

В вашем случае вы объявляете все свои соответствующие переменные внутри цикла, но не присваиваете им начальные значения. Если вы попытаетесь прочитать любое из этих неинициализированных значений перед записью в них, они будут содержать неизвестные данные. Особенно, minTemp , maxTemp , а также mmNedbor читаются без инициализации. Поэтому убедитесь, что все эти переменные имеют начальное значение.

Просто установите все переменные, которые вы используете в вашем цикле, на 0 или что-то в начале цикла, как вы делали с переменными minTempAdd и mmNedborAdd.

Как примечание, ваш код трудно читать, поэтому я бы порекомендовал вам потратить некоторое время на его рефакторинг.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *