2012-10-29 44 views
0

有沒有辦法可以建議幫助擺脫調用Initialize()和Close()方法並將其替換爲使用塊?我可以在這段代碼中以某種方式替換Initial塊()和Close()方法調用嗎?

或者這種方法完全沒問題?

(想法是確保作家將被處置時FooWriter的消費者寫一些字符串,並用它完成。)

class Program 
    { 
     static void Main(string[] args) 
     { 
      var writer = new FooWriter(); 

      writer.Initialize(); 

      foreach (var s in args) 
       writer.Write(s); 

      writer.Cose(); 
    } 


public class FooWriter 
{ 

    public StreamWriter Writer; 

    public void Initialize() 
    { 
     Writer = new StreamWriter("MyFile.txt", false); 
    } 

    public void Write(string line) 
    { 
     if(Writer==null) 
      throw new NullReferenceException(Writer, "Writer"); // Guard Writer 

     Writer.WriteLine(line); 
    } 

    public void Close() 
    { 
     Writer.Dispose(); 
    } 

} 

回答

5

你可以做到這一點使你FooWriterIDisposable。和移動初始化到它的構造:

public class FooWriter : IDisposable { 

    public StreamWriter Writer; 

    public FooWriter() 
    { 
     Writer = new StreamWriter("MyFile.txt", false); 
    } 

    public void Write(string line) 
    { 
     // You do not need to guard the writer, because constructor sets it 
     if(Writer==null) 
      throw new NullReferenceException(Writer, "Writer"); // Guard Writer 

     Writer.WriteLine(line); 
    } 

    public void Dispose() 
    { 
     Writer.Dispose(); 
    } 

} 
1

可以使FooWriter實現IDisposable,並在構造函數中調用初始化(),那麼你可以使用方式如下:

class FooWriter : IDisposable 
{ 
    private StreamWriter Writer; 
    public FooWriter() 
    { 
     Writer = new StreamWriter("MyFile.txt", false); 
    } 
    public void Write(string line) 
    { 
    Writer.WriteLine(line); 
    } 
    public void Dispose() 
    { 
     Writer.Dispose(); 
    } 
} 


// use it 

using (var writer = new FooWriter()) 
{ 
    foreach (var s in args) 
       writer.Write(s); 
} 
1

我會改變你的實現像這樣:

  • 使類實現IDisposable
  • 初始化作家在構造
  • 刪除異常

    公共類FooWriter:IDisposable的 { 公共StreamWriter的作家{獲得;私人設置; }

    public FooWriter(string fileName) 
    { 
        Writer = new StreamWriter(fileName, false); 
    } 
    
    public void Write(string line) 
    {       
        Writer.WriteLine(line); 
    }  
    
    public void Dispose() 
    { 
        Dispose(true); 
        GC.SuppressFinalize(this); 
    } 
    
    protected virtual void Dispose(bool disposeManaged) 
    { 
        if (disposeManaged) 
         Writer.Dispose(); 
    } 
    

    }

+0

我建議讓您保護虛擬處置。 –

+0

哎呀,正在修復。奇怪的是,我無法獲得第一行/最後一行的語法突出顯示...我做錯了什麼? –

相關問題