Почему сборщик мусора в C # не вызывает деструктор FileStream для освобождения собственного дескриптора файла - PullRequest
0 голосов
/ 14 марта 2019

c # имеет класс FileStream и дескриптор файла обтекания ОС.FileStream имеет деструктор , рассмотрим, что мы получаем экземпляр из FileStream и забываем его, если нет никаких ссылок на него, GC должен вызвать его деструктор и освободить дескриптор файла ОС, так что это не произойдет, пока я сам не вызову егораспоряжение или приложение прекращено?

Ответы [ 2 ]

1 голос
/ 14 марта 2019

FileStream реализует IDisposable, что означает, что вы ДОЛЖНЫ вызывать Dispose. Пожалуйста, смотрите предыдущий вопрос Нужно ли удалять объект FileStream?

MS сами скажут вам это https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream?view=netframework-4.7.2

Самый простой способ - использовать выражение "using"

    using (FileStream fs = File.Create(path))
    {
        AddText(fs, "This is some text");
        AddText(fs, "This is some more text,");
        AddText(fs, "\r\nand this is on a new line");
        AddText(fs, "\r\n\r\nThe following is a subset of characters:\r\n");

        for (int i=1;i < 120;i++)
        {
            AddText(fs, Convert.ToChar(i).ToString());

        }
    }
0 голосов
/ 14 марта 2019

Как отмечено в комментариях, всякий раз, когда GC начинает собирать, он освобождает недоступные объекты. Однако во избежание проблем с производительностью сборщик мусора не запускается до тех пор, пока не произойдет одно из этих условий . Лучше не ждать сборщика мусора, и мы сами быстро избавимся от неуправляемых ресурсов.

...