Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Dispose и Finalize, использует ли кто-нибудь? 
:(
    Опции темы
Дрон
  Дата 2.11.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Как мне показалось, программисты в основном забивают на эти методы, надеясь на автоматический GC.

Вот, хочется выяснить, как обстоят дела с их использованием.

Вызываете ли вы Dispose для стандартных классов?
Пишите ли метод Dispose и деструкторы для собственных классов?

И какие вообще рекомендации существуют по этому поводу.


--------------------
Да. Именно так.
PM   Вверх
nikf
Дата 2.11.2005, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: нет
Всего: 1



Если есть Dispose всегда его вызываю. Для свих класов делаю реализацию IDisposable толко в том случае если он сам содержит объекты реализующие IDisposable. Вот и все рекомендации. Врядли будут еще какие
PM MAIL   Вверх
Exception
Дата 2.11.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



вызываю. но своих не пишу, если нече2о освобождать
PM   Вверх
Дрон
Дата 2.11.2005, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(nikf @ 2.11.2005, 15:17)
Если есть Dispose всегда его вызываю. Для свих класов делаю реализацию IDisposable толко в том случае если он сам содержит объекты реализующие IDisposable. Вот и все рекомендации. Врядли будут еще какие

Естественно.

Просто недавно на собеседовании в одной компании у меня как раз возник спор об использовании Dispose smile
Да и в том проекте, где я сейчас занят -- на сотни тысяч строк практически ни одного Dispose smile smile


--------------------
Да. Именно так.
PM   Вверх
Plamenk
Дата 2.11.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



Dispose нужен только там, где есть неуправляемые объекты (в случае когда пишется пользоваетельский класс).
А что касается вызывать его или нет?
То вызывать конечно надо...
Но если не вызвать, то всё равно больших проблем не будет, так как его вызовет деструктор, но немного позже. smile

PM MAIL   Вверх
Exception
Дата 2.11.2005, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



...который не обязательно выполнится. Ведь .NET не обеспечивает детерминированного завершения.
PM   Вверх
Plamenk
Дата 3.11.2005, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



Цитата
...который не обязательно выполнится. Ведь .NET не обеспечивает детерминированного завершения.


Ты хочешь сказать, что NET не гарантирует вызов деструктора?
PM MAIL   Вверх
Дрон
Дата 3.11.2005, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(Plamenk @ 3.11.2005, 09:11)
Ты хочешь сказать, что NET не гарантирует вызов деструктора?

Гарантирует. Но в какой именно момент -- неизвестно.


--------------------
Да. Именно так.
PM   Вверх
Plamenk
Дата 3.11.2005, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



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

Так и я о том же smile

Это сообщение отредактировал(а) Plamenk - 3.11.2005, 09:43
PM MAIL   Вверх
Exception
Дата 3.11.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



ага. "Немного позже" == при выгрузке AppDomain
PM   Вверх
Plamenk
Дата 3.11.2005, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



А что деструкторы вызваются при
Цитата
при выгрузке AppDomain
?

А я думал что, при сборке муссора. Хотя могу ошибаться smile
PM MAIL   Вверх
Exception
Дата 3.11.2005, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



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

Class X
Protected Overrides Sub Finalize()
MsgBox("Я СДОХ!")
End Sub
End Class

и насоздавай кучу таких объектиков. Не факт, что ты увидишь какие-то сообщения.
ЗЫ деструктор в С++ != завершитель в С#. Надо это помнить
PM   Вверх
Plamenk
Дата 3.11.2005, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



Посмотри за окном output. У меня не разу не получилось, чтобы хотябы для одного объекта не вызвался деструктор.


Код

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Diagnostics;
using System.Data;

namespace TestGC
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button button1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(168, 56);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(80, 24);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new Form1());
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            TestGC obj;
            for (int i=0; i<10000; i++)
                obj = new TestGC(); 
        }
    }

    public class TestGC
    {
        static int i = 0;
        public TestGC()
        {
            i+=1;
            Trace.WriteLine(i.ToString());   
        }

        ~TestGC()
        {
            i-=1;
            Trace.WriteLine(i.ToString());   
        }

        
    }
}


Может в VB.Net, что-то по другому?

Это сообщение отредактировал(а) Plamenk - 3.11.2005, 15:44
PM MAIL   Вверх
Exception
Дата 3.11.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



может я и ошибаюсь...
компа нета проверить...
мне казалось, GC происходит не всегда
PM   Вверх
mr.DUDA
Дата 4.11.2005, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



GC, вообще-то, собирает мусор только в двух случаях:
а) когда он посчитает, что свободной памяти ему маловато (10000 таких объектов - это что-то вроде 40-60 Кб)
б) когда приложение простаивает

Принудительно можно вызвать цикл сборки мусора с пом. GC.Collect(), тогда и увидим сообщения из деструкторов.

З.Ы.

Цитата(Run @ 3.11.2005, 10:32)
ага. "Немного позже" == при выгрузке AppDomain

Цитата(Run @ 3.11.2005, 14:17)
дык сборка мусора и происходит при выгрузке домена приложения. И то не всегда.

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


--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.2926 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.