Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这个代码段中,我可以用using块替换Initialize()和Close()方法调用吗?_C#_.net_Idisposable_Streamwriter_Using Statement - Fatal编程技术网

C# 在这个代码段中,我可以用using块替换Initialize()和Close()方法调用吗?

C# 在这个代码段中,我可以用using块替换Initialize()和Close()方法调用吗?,c#,.net,idisposable,streamwriter,using-statement,C#,.net,Idisposable,Streamwriter,Using Statement,有没有什么方法可以帮助您摆脱对Initialize和Close方法的调用,并将其替换为using块 还是这种方法完全可以 这样做的目的是确保当FooWriter的消费者写入一些字符串并以此结束时,编写器将被处理 class Program { static void Main(string[] args) { var writer = new FooWriter(); writer.Initialize(

有没有什么方法可以帮助您摆脱对Initialize和Close方法的调用,并将其替换为using块

还是这种方法完全可以

这样做的目的是确保当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();
    }

}

您可以通过使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();
    }

}

您可以使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);
}

我将更改您的实现,如下所示:

使类实现IDisposable 在构造函数中初始化编写器 删除异常

公共类FooWriter:IDisposable { 公共StreamWriter写入程序{get;private set;}

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


我建议您将受保护的Dispose设置为虚拟。哦,修复。奇怪的是,我无法获得第一行/最后一行的语法突出显示…我做错了什么?