Как сбросить переменную в С#?
Как сбросить переменную? Например, в PHP есть unset($var) функции.
10 ответы
На самом деле нет эквивалента «неустановленному».
Самое близкое совпадение, которое я знаю, это использование по умолчанию ключевое слово.
Переменная по-прежнему будет «установлена», но будет иметь значение по умолчанию.
int[] array1 = new int[] < 1, 3, 5, 7, 9, 10 >; , а затем int array1 = default(int); возвращает >> Локальная переменная с именем ‘array1’ уже определена в этой области — ви
Обращение к приведенному выше комментарию: это потому, что вы повторно объявляете локальную переменную array1 (вы изначально объявляете его как int[] array1 , затем попытайтесь объявить его во второй раз как int array1 ). Предполагая, что вы не собирались менять тип с int[] в int (что невозможно в С#), ваше исправление должно быть: array1 = default(int[]); — рпатель
Вы не можете. Нет понятия «сбросить» переменную. Вы можете установить для него другое значение — 0, null, что угодно. Экземплярные/статические переменные даже не имеют представления о том, установлена ли переменная или нет, а локальные переменные имеют только «определенно назначенные» или «неопределенно назначенные».
Чего вы пытаетесь достичь?
ответ дан 13 окт ’08, 12:10
Наиболее важным использованием unset() в PHP является сброс переменных, которые не определены в области видимости (функция или класс), IMO. Из-за этого C# не нужно сбрасывать, как это делает PHP. 🙂 — вялый
Как правило, установка значения null делает работу (для переменных типов, таких как int, вам нужно будет сделать ее версией с нулевым значением int?).
Если вы хотите использовать переменную только в течение короткого периода времени в более крупной функции, вы можете ограничить ее, например так:
Переменная будет длиться только до закрывающей скобки.
Если они не охватывают ваши обстоятельства, то можете ли вы уточнить, где вам нужно это сделать.
ответ дан 22 дек ’14, 22:12
Может быть, вы хотели бы освободить объект на которую ссылается переменная:
ответ дан 13 окт ’08, 12:10
NB это не гарантирует удаление объекта, к которому MyVar указывал. — Джо
Переменные типа значения не нужно сбрасывать. Они постоянно выделяются.
Для переменных ссылочного типа вы просто устанавливаете их в нуль и сборщик мусора уничтожит связанный объект (и освободит память). Но обратите внимание, что сама переменная будет продолжать существовать во всей своей области (блок кода, метод, жизнь объекта. )
Если вы хотите использовать это для освобождения памяти, просто установите для всех ненужных объектов значение null и подождите, пока сборщик мусора выполнит свою работу.
Редактировать: Как отмечалось в комментариях, я не сказал, что сборщик мусора не начнет сборку сразу. Обычно это происходит, когда фреймворк пытается выделить память и не может найти достаточно свободной. Запустить сборку мусора «вручную» можно, но это не рекомендуется и может ухудшить поведение программы. Для большинства целей поведения сборщика мусора по умолчанию должно быть достаточно.
ответ дан 13 окт ’08, 13:10
Объект будет уничтожен, как только появится нет переменная, предоставляющая ссылку на нее больше. — вялый
@hangy: Это не так просто. Память объекта будет освобождена только при следующем запуске GC (для этого поколения), а не как только на него не ссылается переменная. Есть и другие сложности, такие как циклические ссылки (не проблема) и финализация. 300 символов мало! — Джон Скит
300 символов мало, да. 🙂 Я только что добавил это, потому что, просто используя ответ rslite, можно подумать, что объект исчез, как только для одной переменной установлено значение null. Вы правы, конечно, это не всегда так просто. — вялый
Сборщик мусора просматривает дерево ссылок от листа (в данном случае это объект, который, возможно, должен быть собран) к корню. Если он не укоренен, он будет собран. Другие, также некорневые объекты могут содержать ссылку, и она все равно будет собрана. — пользователь1228
@Will: Нет, он не переходит от листа к корню. Он использует отметку/разметку, обходя все известные корни и затем собирая все, что не отмечено. Вы не можете перемещаться по листу-> корню — объект не знает, что на него ссылается. — Джон Скит
Чтобы сбросить переменную среды, используйте тот же метод Environment.SetEnvironmentVariable, но передайте null или string.Empty в качестве значения. http://msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
«Если значение пусто, а переменная среды, названная переменной, существует, переменная среды удаляется».
Как: сбросить переменную в C #?
Это действительно смешно, но мне не удалось найти ответ самостоятельно. Как я могу отключить переменную? Например. php имеет функцию unset ($ var).
9 ответов
На самом деле не существует эквивалента «unset».
Самое близкое совпадение, которое я знаю, это использование ключевого слова default.
Переменная по-прежнему будет «установлена», но она будет иметь значение по умолчанию.
Вы не можете. Нет понятия «отменить» переменную. Вы можете установить его на другое значение — 0, нуль, независимо от того, что необходимо. У экземпляров/статических переменных даже нет понятия о том, установлена или не установлена переменная, а локальные переменные имеют «определенно назначенные» или «не определенно назначенные».
Чего вы пытаетесь достичь?
Как правило, его значение равно null, задает ли задание (для переменной типов, например int, вы должны сделать ее нулевой версией int?).
Если вы хотите использовать переменную в течение короткого периода времени в большей функции, вы можете ее охватить, например:
Переменная будет действовать только до закрытия скобки.
Если это не касается ваших обстоятельств, тогда вы можете подробно остановиться на том, где вам нужно это сделать.
Возможно, вы хотите освободить объект, на который ссылается переменная:
Переменные типа значения не нужны. Они постоянно выделяются.
Для переменных ссылочного типа вы просто устанавливаете их в null, и сборщик мусора уничтожит связанный объект (и освободит память). Но учтите, что сама переменная будет продолжать существовать во всей ее области (кодовый блок, метод, жизнь объекта. )
Если вы хотите использовать это для свободной памяти, просто установите все ненужные объекты в нуль и дождитесь, когда сборщик мусора выполнит свою работу.
Изменить. Как отмечено в комментариях, я хотел сказать, что сборщик мусора не начнет сбор немедленно. Это обычно происходит, когда среда пытается выделить память и не может найти достаточно свободного. Можно запустить «вручную» сбор мусора, но это нецелесообразно и может ухудшить поведение программы. Для большинства целей поведение по умолчанию GC должно быть достаточным.
How do you clear a stringstream variable?
![]()
For all the standard library types the member function empty() is a query, not a command, i.e. it means «are you empty?» not «please throw away your contents».
The clear() member function is inherited from ios and is used to clear the error state of the stream, e.g. if a file stream has the error state set to eofbit (end-of-file), then calling clear() will set the error state back to goodbit (no error).
For clearing the contents of a stringstream , using:
is correct, although using:
is technically more efficient, because you avoid invoking the std::string constructor that takes const char* . But any compiler these days should be able to generate the same code in both cases — so I would just go with whatever is more readable.
![]()
You can clear the error state and empty the stringstream all in one line
This effectively resets m to a default constructed state, meaning that it actually deletes the buffers allocated by the string stream and resets the error state. Here’s an experimental proof:
When the demo is compiled with address sanitizer, memory usage is revealed:
Pretty steep if you ask me. To hold just 16bytes of payload, we spent 905 bytes . string streams are no toy. Memory is allocated in two parts:
- The constructed string stream (392 bytes)
- The extra buffer needed for the payload (513 bytes). The extraneous size has to do with the allocation strategy chosen by the stream and for payloads <= 8 bytes, blocks inside the initial object can be used.
If you enable method 1 (the one shown in this answer) the extra 513 (payload) bytes are reclaimed, because the stream is actually cleared.
If you enable method2 as suggested in the comments or other answers, you can see that all 905 bytes are in use by the time we exit.
In terms of program semantics, one may only care that the stream "appears" and "behaves" as empty, similar to how a vector::clear may leave the capacity untouched but render the vector empty to the user (of course vector would spend just 16 bytes here). Given the memory allocation that string stream requires, I can imagine this approach being often faster. This answer’s primary goal is to actually clear the string stream, given that memory consumption that comes with it is no joke. Depending on your use case (number of streams, data they hold, frequency of clearing) you may choose the best approach.
Finally note that it’s rarely useful to clear the stream without clearing the error state and all inherited state. The one liner in this answer does both.
Удалить переменную в теле программы Си
Я объявляю статическую переменную counter в начале программы в двух первых функциях она нужна, а в третьей она не нужна. Можно ли ее как-то удалить?
Перемещено beastie из general

Во-первых, в development. Во-вторых, Это что, клуб изучения Си?

Статическую нет, выделяй динамически, если переменная — экземпляр большой структуры, если это какой-нибудь int, то ваще забей.
Не, поизвращаться на самом деле можно, это же си, но ты что-то делаешь не так. Зачем тебе её удалять и что ты вообще под этим понимаешь?

Да ладно тебе агриться, с каких пор тут вопросы по сям запрещены?
Чтобы осталось больше памяти
Я объявляю статическую переменную counter в начале программы
Интересно, что ты понимаешь под «объявляю» и «статическую». Как ты понимаешь это физически?
static int counter

Сколько памяти она занимает и сколько у тебя есть? У тебя что, микроконтроллер?
Да, микроконтроллер Arduino

Ты экономишь 4 байта?
Вопрос явно не понят. Что происходит физически?
А почему бы и нет?

Потому, что твоё последнее сообщение весит больше))
Ну, так можно или нет?
Подсказываю: «объявление» — это выделение памяти, где произойдёт это выделение с учётом static?
Это вообще возможно?
Фактически в «теле» процесса. Пока процесс не завершён, ты ничего назад не получишь.
Значит, так сделать нельзя?
Как мне известно, нельзя. Физически не получится.

Ну переписать область в сегменте данных можно.
Можешь дать пример кода?
Ну переписать область в сегменте данных можно.

Так он так и не ответил, что он понимает под освободить. Он видимо хочет переиспользовать память, переписать это и означает.

Нет, гугли. И учти, что это будет системно-зависимо.

Ну тогда ой) вот что я нашёл на со
Assuming you are using gnu tools (gcc, binutils) if you look at the linker scripts the embedded folks use like the gba developers and microcontroller developers using roms (yagarto or devkit-arm for example). In the linker script they surround the segments of interest with variables that they can use elsewhere in their code. For rom based software for example you specify the data segment with a ram AT rom or rom AT ram in the linker script meaning link as if the data segment is in ram at this address space, but also link the data itself into rom at this address space, the boot code then copies the .data segment from the rom to the ram using these variables. I dont see why you couldnt do the same thing to have the compiler/linker tools tell you where stuff is then runtime use those variables to grab the data from memory and save it somewhere to hybernate or shut down and then restore that data from wherever. The variables you use to perform the restore of course should not be part of the .data segment or you trash the variables you are using to restore the segment.
Я поставил стул, чтобы сидеть, когда читаю и ем, но когда сплю, он не нужен. Можно ли его как-то выкинуть?

Не совсем корректная аналогия, стул ты можешь выкинуть хоть в окно в любой момент.
стул ты можешь выкинуть хоть в окно в любой момент.