2014-11-05 17 views
5

Generalmente, "utilizzare" è l'approccio preferito per l'accesso e lo smaltimento di un filestream in modo corretto.C'è un modo per usare "usando" ma lasciare il file aperto?

Spesso ho bisogno di lasciare il file aperto (come di seguito). In questo caso è possibile utilizzare la struttura "utilizzabile"?

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

Non ha senso utilizzare "using" all'interno di un metodo se non si intende chiudere il flusso all'interno di tale ambito. Lo schema generale qui sarebbe quello di rendere l'implementazione del 'logger' [' IDisposable'] (http://msdn.microsoft.com/en-us/library/system.idisposable (v = vs.110) .aspx), quindi in pratica fai in modo che la classe chiamante si preoccupi quando viene eliminata (usando 'using' oppure no) –

+2

Usa NLog o un altro framework. # –

+0

@ManInMoon come vorresti usare * usando * in questo caso, in pseudo codice? – galenus

risposta

4

Sì, è fare Logger usa e getta e lo hanno smaltire il flusso nel suo metodo 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

In void Dispose() intendevi chiamare sw.Close() o è sw.Dispose() corretto – ManInMoon

+3

@ManInMoon 'Dispose' chiuderà lo stream - è un dettaglio di implementazione ma è documentato. –

+0

C'è anche una buona lettura su SO su come [Proprietà usa l'interfaccia IDisposable] (http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface) con ulteriori informazioni sull'interfaccia . –