2014-11-05 4 views
5

Как правило, «использование» является предпочтительным подходом к правильному доступу и удалению фильтра.Есть ли способ использовать «использование», но оставить файл открытым?

Мне часто нужно оставить файл открытым (как показано ниже). Может ли использоваться «использующая» структура в этом случае?

public class logger 
{ 
    private StreamWriter sw; 
    public logger(string fileName) 
    { 
     sw = new StreamWriter(fileName, true); 
    } 

    public void LogString(string txt) 
    { 
     sw.WriteLine(txt); 
     sw.Flush(); 
    } 

    public void Close() 
    { 
     sw.Close(); 
    } 
} 
+11

Нет смысла использовать 'использование' внутри метода, если вы не собираетесь закрывать поток в этой области. Общая схема здесь заключалась бы в том, чтобы сделать ваш инструмент «logger» ['IDisposable'] (http://msdn.microsoft.com/en-us/library/system.idisposable (v = vs.110) .aspx), затем вы в основном заставляете вызывающий класс беспокоиться о том, когда он будет удален (используя 'using' или нет) –

+2

Используйте NLog или другую фреймворк. # –

+0

@ManInMoon Как бы вы хотели использовать * используя * в этом случае в псевдокоде? – galenus

ответ

4

Да, вы делаете Logger одноразовые и иметь его отчуждать потока в методе Dispose.

// I make it sealed so you can use the "easier" dispose pattern, if it is not sealed 
// you should create a `protected virtual void Dispose(bool disposing)` method. 
public sealed class logger : IDisposable 
{ 
    private StreamWriter sw; 
    public logger(string fileName) 
    { 
     sw = new StreamWriter(fileName, true); 
    } 

    public void LogString(string txt) 
    { 
     sw.WriteLine(txt); 
     sw.Flush(); 
    } 

    public void Close() 
    { 
     sw.Close(); 
    } 

    public void Dispose() 
    { 
     if(sw != null) 
      sw.Dispose(); 
    } 
} 
+1

В void Dispose() вы намеревались вызвать sw.Close() или sw.Despose() correct – ManInMoon

+3

@ManInMoon 'Dispose' закроет поток - это деталь реализации, но документирована. –

+0

Существует также хорошее сообщение о том, как [Свойство использовать IDisposable интерфейс] (http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface) с дополнительной информацией об интерфейсе , –