Использование ключевого слова и управляемого \ неуправляемого кода

Ключевое слово C# Using реализует Idisposable, который предоставляет механизм для освобождения неуправляемых ресурсов.

Теперь я проходил этот код

string txt = String.Empty;
      using (StreamReader sr = new StreamReader(filename)) {
         txt = sr.ReadToEnd();
      }

и не могу перестать задаваться вопросом, почему ключевое слово Using используется в этом коде, в то время как StreamReader является управляемым ресурсом, и сборщик мусора несет ответственность за освобождение памяти объектов после того, как его область действия будет исчерпана.

Итак, мой вопрос,

  1. Является ли приведенный выше код просто явным способом обработки для освобождения ресурсов
  2. Насколько я понимаю, любые методы или классы, которые мы используем в рамках.net - это управляемый код, тогда StreamReader также не попадает под управляемый код.
  3. Я что-то упустил в управляемом \ неуправляемом коде

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.

Другие вопросы по тегам