Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Penelent
Заблокирован
1

Вызывается ли Dispose?

15.02.2016, 21:48. Просмотров 552. Ответов 8
Метки нет (Все метки)

есть disposable объекты, типа stream... так вот вопрос такой если написать вот так например:
C#
1
2
var serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(new StreamWriter(filename), obj);
то созданный объект StreamWriter потом уничтожится? просто чтоб using не писать... или все таки надо?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2016, 21:48
Ответы с готовыми решениями:

Dispose
действия с бд добавление значений и подгрузка их в датагрид. после дейтсвия добавление/загрузки ...

Dispose() не работает
Есть программа - клиент, который соединяется с сервером и они начинают передавать данные друг...

Не работает Dispose()
Возникли трудности в программе на одном из этапов: Текст сплитится и закидывается в List. Далее...

Метод Dispose
Всем привет, вопрос глупый, но все таки спрошу, чтобы быть уверенным. Есть форма, на форме...

Dispose(false)
Здравствуйте. Есть пример из учебника в котором демонстрируется метод Dispose(). using System;...

8
inst_mefi
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
15.02.2016, 22:24 2
Penelent, возьми за правило неуправляемые ресурсы помещать в using. Очень полезная привычка. Я честно не знаю, есть ли в деструкторе StreamWriter вызов Dispose. Но по умолчанию, если автор Disposable типа не прописал в деструктор освобождение ресурсов, то сборщик мусора убьет StreamWriter, как управляемый объект, а то что должно через Dispose освобождаться останется висетьв памяти. Короче всегда пиши using или сам вызывай Dispose руками. Лучше using.
0
insite2012
Модератор
Эксперт .NET
4878 / 3831 / 1096
Регистрация: 12.10.2013
Сообщений: 11,101
Записей в блоге: 2
15.02.2016, 22:41 3
Цитата Сообщение от Penelent Посмотреть сообщение
или все таки надо?
Именно так. Если в объекте предусмотрена зачистка (через Dispose()/Close()), то разработчики не зря ее туда включили.
Используй совет из предыдущего поста.
Цитата Сообщение от inst_mefi Посмотреть сообщение
всегда пиши using или сам вызывай Dispose
0
OwenGlendower
Супер-модератор
Эксперт .NET
10438 / 8988 / 3838
Регистрация: 17.03.2014
Сообщений: 18,057
Записей в блоге: 1
16.02.2016, 02:30 4
Penelent, будет ли вызван Dispose и будет ли объект уничтожен это два разных вопроса. Объект будет уничтожен. Dispose() не будет вызван т.к. сборщик мусора "знает" только о финализаторах. У каждого своя задача. Сборщик мусора занимается управляемой кучей. Финализатор освобождает неуправляемые ресурсы. Механизм using+IDisposable тоже предназначен для освобождения неуправляемые ресурсов, но уже в детерминированной манере т.к. дает программисту возможность четко указать границы где используется некий ресурс с его освобождением в конце. В данном случае экземпляр StreamWriter будет держать файл открытым пока до него не доберется сборщик мусора и не вызовет финализатор для неявно созданного FileStream который и закроет файл. Когда именно это произойдет мы не знаем. И это конечже же плохо. Поэтому в данном случае не надо экономить на спичках и добавить блок using.
0
Penelent
Заблокирован
16.02.2016, 07:36  [ТС] 5
ладно я понял, я только не понимаю почему нельзя было сделать чтобы все просто освобождалось в финализаторе? так же было бы гораздо проще...
0
Vigelforts
141 / 117 / 26
Регистрация: 07.12.2014
Сообщений: 371
16.02.2016, 09:00 6
Penelent, не проще. Ты не можешь управлять вызовом финализатора. В итоге например у тебя может случайно падать программа при попытке повторно открыть файл, т.к. предыдущий Stream ещё ждёт своей очереди на финализацию и держит файл открытым, и отследить ты это уже не в состоянии
0
Penelent
Заблокирован
16.02.2016, 09:50  [ТС] 7
Vigelforts, и тут мы подходим к главному вопросу: в чем разница между финализатором и деструктором? я вот этого никогда не понимал
0
Vigelforts
141 / 117 / 26
Регистрация: 07.12.2014
Сообщений: 371
16.02.2016, 09:54 8
Penelent, ни в чём по сути. Финализатор это деструктор в мире .Net
0
Woldemar89
TheGreatCornholio
1213 / 695 / 281
Регистрация: 30.07.2015
Сообщений: 2,372
Завершенные тесты: 1
16.02.2016, 10:13 9
Penelent, финализатор используется в языках со сборщиком мусора.
Он вызывается при сборке мусора перед уничтожением объекта.

Добавлено через 4 минуты
То, что ты называешь деструктором ~SomeClass, - при компиляции превратится в финализатор Finalize.
То есть деструкторов как бы и нет, а даже если они есть - нет смысла их использовать.
Неуправляемые ресурсы - уничтожай с помощью Dispose() или обрамляй в using.
COM обьекты - уничтожай с помощью ReleaseComObject.
А у остального - просто обнуляй ссылки.

Добавлено через 8 минут
Penelent, попробуй скомпилить и посмотри на ошибку.

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SomeClass sc = new SomeClass();
 
            sc.Finalize();
 
            Console.ReadKey();
        }
    }
 
 
    class SomeClass { 
    
    public ~SomeClass(){
 
        Console.WriteLine(@"~SomeClass called...");
 
    }
 
    public override void Finalize(){
 
        Console.WriteLine(@"Finalize() called...");
    
    }
    
    
    }
 
}


Может я что-то напутал, конечно, но с чего бы ради компилятор 2 метода за один и тот же считал?
0
16.02.2016, 10:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2016, 10:13

Close(); Dispose()
Подскажите, пожалуйста, имеет ли смысл вызывать и Close() и Dispose() по окончанию работы с...

.Dispose() потоков
Вот такой код. using (FileStream fs = new FileStream(saveFileDialog.FileName, FileMode.Create))...

Using не вызывает Dispose
Написал свой Mutex, теперь хочу чтобы он работал с конструкцией using, унаследовал интерфейс...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru