2015-03-23 5 views
0

Скажем, у меня есть структура с несколькими членами, например.Очистить структуру в C#

private struct MyStats 
{ 
    public int packsGood, packsBad, packsTotal; 
    public bool haveAcceptedStart; 
    // ...and a bunch of other parameters 
} 

Если у меня есть переменная-член MyStats типа, как я использую его на некоторое время, а затем быстро очистить его? В Delphi или C++ я мог бы использовать следующий код:

memset(&m_stats, 0, sizeof(MyStats));  // C++ 
ZeroMemory(@m_stats, SizeOf(MyStats));  // Delphi 

, но это не представляется возможным в C#. Конечно, мне не нужно каждый раз пробираться через всех участников или PInvoke при вызове API?

+0

Почему бы просто не назначить пустой/новый экземпляр структуры переменной-члену? – TZHX

+2

В объектах C# не нужно «очищать», сборщик мусора освободит память, которая занята объектами, которые больше не используются программой, как только система ее нуждается. Поэтому вам просто нужно убедиться, что объект больше не нужен. –

+8

m_stats = new MyStats(); –

ответ

1

Управление памятью обычно не должно быть одной из ваших проблем в C#, в отличие от C или C++. Существует сборщик мусора, чтобы заботиться о очистке памяти. Как только все ссылки на вашу структуру исчезнут, сборщик мусора вернет память где-то в будущем. Когда это совершенно не важно для разработчика.

+0

Спасибо за ответ. Есть редкие обстоятельства, когда вам нужно получить некоторый детерминизм от сборщика мусора с помощью GC.Collect (например, встроенные системы с ограниченными ресурсами памяти/ЦП). – AlainD

0

Если у вас есть поле в вашем классе, которое будет использоваться для его очистки, тогда ваш класс не будет правильно разработан и не будет соответствовать принципам ООП.

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

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