0

Initialize()メソッドとClose()メソッドの呼び出しを取り除き、usingブロックを置き換えるのに役立つ方法はありますか?

または、このアプローチは完全にOKですか?

(アイデアは、FooWriterのコンシューマーがいくつかの文字列を書き込み、これで終了したときにWriterが破棄されるようにすることです。)

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();
    }

}
4

3 に答える 3

5

あなたはあなたを作ることによってそれをすることができFooWriterますIDisposable。初期化をコンストラクターに移動します。

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();
    }

}
于 2012-10-29T12:59:11.957 に答える
1

FooWriterにIDisposableを実装させ、コンストラクターでInitialize()を呼び出すことができます。その後、次のように使用できます。

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);
}
于 2012-10-29T13:01:44.850 に答える
1

私はあなたの実装を次のように変更します:

  • クラスにIDisposableを実装させる
  • コンストラクターでライターを初期化します
  • 例外を削除します

    public class FooWriter:IDisposable {public StreamWriter Writer {get; プライベートセット; }

    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();
    }
    

    }

于 2012-10-29T13:02:55.087 に答える