2014-02-18 5 views
4

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

Я код, как это:

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"); 

Спасибо заранее.

ответ

5

У вас есть constructor for StreamWriter (NET Framework 4.5 только), что позволяет задать leaveOpen булево, который определяет, имеет ли ваш экземпляр собственности на основной поток или нет.

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

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

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

+0

@AdamHouldsworth Сам 'StreamWriter' вызывает' Dispose' в базовом потоке, который в свою очередь вызывает 'Close' в потоке. Так что да, если реализация базового потока переопределяет 'Close' для _not_ фактически закрывает поток, это не сработает, но это будет реализация _silly_, поэтому IMHO не стоит принимать во внимание в документации. – ken2k

+0

@AdamHouldsworth, ken2k (Adam - я не уверен, почему вы удалили ответ) Да, я вижу оба ответа, и они оба правильны в соответствии с вопросом (теперь есть проблема, что у меня есть только один тик: | и не более голосов). Подводя итог, если я пишу свой собственный IDisposable и не обрабатываю Dispose правильно, мой созданный поток может выжить, если он не будет собран GC? – Romasz

+0

@Romasz GC и Dispose - это две разные вещи. GC в конечном итоге очищает экземпляры, которые больше не упоминаются в вашем коде; Dispose - это ручной вызов, который используется для немедленного освобождения (неуправляемых) ресурсов. Что вы подразумеваете под «моим собственным IDisposable»? – ken2k

0

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

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.

+2

Не отвечает на вопрос, заданный ОП. – series0ne

+2

И личное мнение о том, лучше ли использовать '{}' при использовании в ситуации, описанной выше. – Maarten

0

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

using Statement (C# Reference)

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

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

0

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

Смежные вопросы