Использование - что происходит с моим потоком?

Может быть, это тривиальный вопрос, но он беспокоит меня. И не кричите хвалу, если это дубликат - я пытался найти, но вопросов по использованию было так много, что мне было трудно найти ответ.

У меня есть такой код:

using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication())
using (StreamWriter writeFile = new StreamWriter(new IsolatedStorageFileStream("example.txt", FileMode.Create, ISF)))
     writeFile.WriteLine("Example");

И мои вопросы: что происходит с моим созданным IsolatedStorageFileStream, когда StreamWriter утилизируется, оставляя использование? Будет ли это также утилизироваться?

Есть ли разница по сравнению с этим кодом:

using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication())
using (IsolatedStorageFileStream stream = ISF.CreateFile("example.txt"))
using (StreamWriter writeFile = new StreamWriter(stream))
     writeFile.WriteLine("Example");

Заранее спасибо.

4 ответа

Решение

У вас есть конструктор дляStreamWriter (Только для NET Framework 4.5), что позволяет указать leaveOpen логическое значение, определяющее, становится ли ваш экземпляр владельцем основного потока или нет.

Если не указано (как в вашем примере, или для предыдущих версий фреймворка), по умолчанию это falseТаким образом, закрытие (или удаление) экземпляра закрывает основной поток.

Если вы не установили для параметра leftOpen значение true, объект StreamWriter вызывает метод Dispose() для предоставленного объекта Stream при вызове StreamWriter.Dispose.

Таким образом, нет никакой разницы между предоставленными вами фрагментами кода.

Как только он покидает блок using, вызывается Dispose.

используя Statement (C# Reference)

Оператор using вызывает метод Dispose для объекта правильным образом и (когда вы используете его, как показано ранее), он также заставляет сам объект выходить из области действия при вызове Dispose. Внутри блока using объект доступен только для чтения и не может быть изменен или переназначен.

Оператор using гарантирует, что Dispose вызывается, даже если возникает исключение, когда вы вызываете методы объекта.

Ваш поток остается открытым, даже если средство записи потока удаляется. Вы можете, например, открыть другую запись потока и продолжить запись в поток.

Используйте {} всегда! Это делает намерение вашего кода намного лучше. Ваш код выглядит так:

using (IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication())
{
    using (StreamWriter writeFile = new StreamWriter(new    IsolatedStorageFileStream("example.txt", FileMode.Create, ISF)))
    {
        writeFile.WriteLine("Example");
    }
}

Затем вы можете увидеть, что StreamWriter выполняется в контексте ISF. Если я правильно понимаю ISF, ISF не должен закрываться, когда Streamwriter закрывает файл. И вы можете открыть другой файл в блоке ISF.

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