Использование ключевого слова и управляемого \ неуправляемого кода
Ключевое слово C# Using реализует Idisposable, который предоставляет механизм для освобождения неуправляемых ресурсов.
Теперь я проходил этот код
string txt = String.Empty;
using (StreamReader sr = new StreamReader(filename)) {
txt = sr.ReadToEnd();
}
и не могу перестать задаваться вопросом, почему ключевое слово Using используется в этом коде, в то время как StreamReader является управляемым ресурсом, и сборщик мусора несет ответственность за освобождение памяти объектов после того, как его область действия будет исчерпана.
Итак, мой вопрос,
- Является ли приведенный выше код просто явным способом обработки для освобождения ресурсов
- Насколько я понимаю, любые методы или классы, которые мы используем в рамках.net - это управляемый код, тогда StreamReader также не попадает под управляемый код.
- Я что-то упустил в управляемом \ неуправляемом коде
2 ответа
почему в этом коде используется ключевое слово Using, а StreamReader - это управляемый ресурс
Хотя StreamReader является управляемым объектом, он может содержать объекты внутри него, которые не размещены в управляемой куче. Сборщик мусора не видит их размещения и поэтому не может их очистить. Для частного случая StreamReader
это внутренне создает FileStream
(для вашего конкретного случая), который внутренне создает и хранит дескриптор файла WIN32.
_handle = Win32Native.SafeCreateFile(tempPath, fAccess, share, secAttrs, mode, flagsAndAttributes, IntPtr.Zero);
( Ссылка на код)
using
это просто сокращение для:
try
{
var streamReader = new StreamReader(path);
// code
}
finally
{
streamReader.Dispose();
}
Методы реализации IDisposable
необходимо реализовать Dispose
где они получают возможность закрыть дескрипторы файлов, сокеты или любой другой ресурс, который может нуждаться в ручной очистке.
Если кто-то хочет провести StreamReader
внутри класса, то этот класс должен реализовать IDisposable
тоже правильно передать на Dispose
к StreamReader
,
Итак IDisposable
может рассматриваться как контракт для классов, которые содержат собственные объекты или объекты, реализующие IDisposable
Я думаю, что это скорее защитный стиль кодирования, когда я не хочу, чтобы объект чтения потоков использовался, поскольку файл, связанный с этим объектом, уже полностью прочитан с использованием функции ReadtoEnd и на него ссылается txt.