2015-03-11 3 views
-5

У меня есть 2 формы окон; Form1.cs и Form2.cs.Освобождение или очистка созданных объектов

Вот код Form1.cs, в котором будет отображаться Form2.cs и скрыть текущий Form1.cs

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 f2 = new Form2(); 
    f2.Show(); 
    this.Hide(); 
} 

Вот код Form2.cs, в котором будет отображаться Form1.cs и Скрыть текущие Form2.cs

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 f2 = new Form2(); 
    f2.Show(); 
    this.Hide(); 
} 

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

+1

В чем Ваш вопрос? – user01928374655647382910019283

+0

Новое - «произведено, введено или обнаружено недавно или сейчас впервые, ранее не было». – Sayse

ответ

3

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

Возможно, вы ищете this.Close() вместо this.Hide(), так как первые будут закрывать и располагать текущую форму, в то время как последняя только скроет ее.

Если вы хотите скрыть и повторно показать формы, вам необходимо сохранить ссылку на формы. Существует много соображений (должна ли форма быть создана только один раз или каждый раз, когда она запрашивается? Если возможно открыть несколько экземпляров одной и той же формы и т. Д.) И возможных шаблонов и (сторонних) решений (например, Application Controller, What is a proper way of building Winform apps with multiple “screens”).

Одним из решений было бы просто создать свой собственный вид реестра, где каждая форма имеет синглтона:

public static class FormRegistry 
{ 
    private static Lazy<Form1> _form1 = new Lazy<Form1>(() => new Form1()); 
    public static Form1 Form1 
    { 
     get 
     { 
      return _form1.Value; 
     } 
    }  
    private static Lazy<Form2> _form2 = new Lazy<Form2>(() => new Form2()); 
    public static Form2 Form2 
    { 
     get 
     { 
      return _form2.Value; 
     } 
    } 
} 

Тогда где-нибудь в коде, вы можете просто сделать FormRegistry.Form1.Show(). Обратите внимание, что этот код является доказательством концепции со многими проблемами и большим количеством возможностей для улучшения, но это дает вам общую идею.

+0

Это именно то, что я ищу. Спасибо, я изучу эту концепцию. –

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