Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
начал понимать msdn
57 / 57 / 6
Регистрация: 11.03.2010
Сообщений: 232

Оперативная память при Form2 form2 = new Form2();

13.03.2011, 14:19. Показов 3169. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, подскажите пожалуйста, будут ли висеть в оперативной памяти экземпляры форм, когда код первой формы повторяется неоднократно?

Код первой формы.

C#
1
2
   Form2 form2 = new Form2();
 form2.ShowDialog();
Код второй формы.
C#
1
this.Close();
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2011, 14:19
Ответы с готовыми решениями:

Как сделать так чтобы при запуске программы первой открывалась Form2, а не Form1
Как сделать так чтобы при запуске программы первой открывалась Form2, а не Form1

открыть Form2
Добрый день!! Подскажите, только начал пытать учиться программировать на с#. Вопрос состоит в том как программно написать код. Есть...

Перенос из Form1 в Form2
такой вопрос : Есть у меня в 1 форме код "string cmd= login.Text + "" + " " + pass.Text + "";" В первой заполняем поля логин,пас и...

14
Шаровик затейник
 Аватар для Crudelis
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
13.03.2011, 14:24
Laak, насколько я знаю память под объекты выделяется при компиляции, т.е. программа смотрит сколько у неё будет объектов и перед запуском выделяет память.
0
начал понимать msdn
57 / 57 / 6
Регистрация: 11.03.2010
Сообщений: 232
13.03.2011, 14:25  [ТС]
Цитата Сообщение от Crudelis Посмотреть сообщение
Laak, насколько я знаю память под объекты выделяется при компиляции, т.е. программа смотрит сколько у неё будет объектов и перед запуском выделяет память.
Ну я же по сути создаю новый объекты формы 2 ? или нет?
0
4 / 4 / 1
Регистрация: 25.01.2011
Сообщений: 32
13.03.2011, 14:43
.ShowDialog() не позволит вам работать с чем либо, кроме открывшегося окна. Попробуйте.
ЗЫ пока вторая форма не закроется, код первой не будет продолжаться.
0
начал понимать msdn
57 / 57 / 6
Регистрация: 11.03.2010
Сообщений: 232
13.03.2011, 14:53  [ТС]
Да я это знаю, я совсем про другое.
Когда я закрываю форму this.Close();
я снова могу работать в первой форме и создавать то что написал ранее.

Я про то, будет ли висеть в оперативной памяти вторая форма после её закрытия.
Случай 1
Просто я могу один раз в коде создать например при загрузке программы
C#
1
2
3
4
5
6
  
 
       private void Form1_Load(object sender, EventArgs e)
        {
Form2 form2 = new Form2();
        }
и все время вызывать кнопкой

C#
1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
        {
           form2.ShowDialog();
            
        }
созданное ранее.

а могу по другому вот так, например кнопкой и у меня код будет выполнятся всегда при нажатии кнопки.
случай 2
C#
1
2
3
4
5
6
private void button1_Click(object sender, EventArgs e)
        {  
 
 Form2 form2 = new Form2();
form2.ShowDialog(); 
}
мне выгодней использовать второй случай, поэтому и возник этот вопрос.
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
13.03.2011, 15:18
Laak, this.Close() на второй форме не особождает память выделенную под Form2.
Случай 1 в твоем варианте не будет работать совсем, т.к. form2 , обьявленная в пределах Form1_Load за пределами этого метода уже работать не будет.
Он будет работать, если сделать так
C#
1
2
3
4
5
Form2 form2;
       private void Form1_Load(object sender, EventArgs e)
        {
                form2 = new Form2();
        }
и тогда действительно каждый раз будет открываться одна и таже форма, т.к метод Close() фактически только скрывает окно а не уничтожает его.
Случай 2 Сработает, и объект form2 будет уничтожен, но не гарантированно что сразу, а только при запуске системы сбора мусора.
Для гарантированного освобождения памяти следует использовать конструкцию
C#
1
2
3
4
5
6
        private void button1_Click(object sender, EventArgs e)        
        {
            Form2 f2 = new Form2();
            f2.ShowDialog();
            f2.Dispose();
        }
либо
C#
1
2
3
4
5
6
7
        private void button1_Click(object sender, EventArgs e)        
        {
            using (Form2 f2 = new Form2())
            {
                f2.ShowDialog();
            }            
        }
Добавлено через 1 минуту
Если же тебе интересно, чтобы каждый раз окно было новым, то беспокоится о сборке мусора и оперативной памяти нет смысла, твой второй вариант вполне будет работать
2
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
13.03.2011, 15:47
Цитата Сообщение от nio Посмотреть сообщение
т.к метод Close() фактически только скрывает окно а не уничтожает его.
Нет. Close внутри себя вызывает base.Dispose, поэтому произойдет чистка ресурсов, после Close сделать f2.Show() будет нельзя, т.к. объект уже будет уничтожен.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Form1 frm;
 
private void button1_Click ( object sender, EventArgs e ) {
    if (frm == null)    // Если null, то создаем новую
        frm = new Form1();
 
    //if (frm.IsDisposed)    // Если уничтожена, то создаем новую
    //    frm = new Form1();
 
    if (!frm.Visible)   // Если не видна ...
        frm.Show();     // ... показываем.
    else
        frm.Close();    // ... иначе закрываем.
        // После этого frm != null, но ресурсы уже почищены,
        // поэтому frm.Show() вывалит exception.
}
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
13.03.2011, 16:41
Цитата Сообщение от SSTREGG Посмотреть сообщение
Нет. Close внутри себя вызывает base.Dispose, поэтому произойдет чистка ресурсов, после Close сделать f2.Show() будет нельзя, т.к. объект уже будет уничтожен.
Не может быть
код первой формы
C#
1
2
3
4
5
6
7
8
9
10
Form2 f2;
        private void button1_Click(object sender, EventArgs e)        
        {
            f2 = new Form2();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            f2.ShowDialog();
        }
код второй
C#
1
2
3
4
private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
Пробовал 10 раз нажимать button2 на первой форме и button1 на второй, работает (f2 не уничтожается)
2
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
13.03.2011, 17:09
**** блин, надо было смотреть чётче ) Я про Show говорил, а у тебя ShowDialog. Мой косяк.

В таком случае - да, форма не уничтожается.
2
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
13.03.2011, 17:17
Цитата Сообщение от SSTREGG Посмотреть сообщение
Я про Show говорил, а у тебя ShowDialog
Не знал (редко пользуюсь Show). Спасибо
1
начал понимать msdn
57 / 57 / 6
Регистрация: 11.03.2010
Сообщений: 232
13.03.2011, 19:13  [ТС]
Т.е. по сути мне можно использовать только это ?
Цитата Сообщение от nio Посмотреть сообщение
f2.Dispose();
Добавлено через 35 секунд
Либо так ?
C#
1
2
3
4
 using (Form2 f2 = new Form2())
            {
                f2.ShowDialog();
            }
Добавлено через 42 секунды
А разница большая в этих двух случаях ? или это на "любителя" ?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
13.03.2011, 19:33
Цитата Сообщение от Laak Посмотреть сообщение
А разница большая в этих двух случаях ? или это на "любителя" ?
Вот что пишет MSDN
Оператор using соответствующим образом вызывает метод Dispose в объекте и (если он используется как описано выше) приводит к выводу объекта из области действия сразу после вызова Dispose. В рамках блока using объект доступе только для чтения и не может быть изменен или переназначен.
Dispose() - освобождает все ресурсы, используемые объектом
Так что практически тоже самое
Но опять же повторюсь это нужно для того, что бы контролировать ресурсопотребление. Для твоего же примера я не вижу необходимости использования ни того ни другого.
0
начал понимать msdn
57 / 57 / 6
Регистрация: 11.03.2010
Сообщений: 232
13.03.2011, 19:46  [ТС]
Ну в данном примере и в правду нету необходимости контролировать, но это был лишь элементарный пример.
Затем у меня во второй форме много переменных (около 30-40) примерно половина из которых строковые массивы с количеством строк около 10, которые в ОЗУ совсем не нужны, а за 1 включение программы вторая форма может быть создана не одну сотню раз (может быть две или три в течении дня) . Может быть тут уже есть смысл ? Или так же нету? Если нету, то я не буду даже заморачиваться
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
13.03.2011, 20:00
Цитата Сообщение от Laak Посмотреть сообщение
Может быть тут уже есть смысл ? Или так же нету? Если нету, то я не буду даже заморачиваться
Почитай
1
начал понимать msdn
57 / 57 / 6
Регистрация: 11.03.2010
Сообщений: 232
13.03.2011, 20:59  [ТС]
Почитал, спасибо еще раз.
А тому кому лень читать, можете не парится, памяти хватит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.03.2011, 20:59
Помогаю со студенческими работами здесь

Из textbox в form2 datagrid
Есть форма2, в ней datagridview1, нужно заменить значения выделенной ячейки в datagrid1.. значения уже есть в textbox'ах, нужно только...

Взаимодействовать с treeview1 из Form2
Привет всем, Подскажите пожалуйста, как сделать чтоб при нажатии на кнопку на FORM2, очищался treeview1 который находиться на Form1 ...

управление Form1 из Form2
Форма 1 на label1 modifiers установил public. private void button1_Click(object sender, EventArgs e) { Form2...

Как связать Form1 и Form2?
Помогите, пожалуйста, излазил весь интернет, но так и не понял, как можно связать две формы между собой. Т.е. есть 2 формы Form1 и Form2 ...

Получение записанных данных из Form1 в Form2
Доброе время. Вот стоит задача такая: Нужно вытащить данные записанные в textBox5 в Forms1 и записать их в textBox1 в Forms2. Как это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru