C# 在这个代码段中,我可以用using块替换Initialize()和Close()方法调用吗?
有没有什么方法可以帮助您摆脱对Initialize和Close方法的调用,并将其替换为using块 还是这种方法完全可以 这样做的目的是确保当FooWriter的消费者写入一些字符串并以此结束时,编写器将被处理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(
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设置为虚拟。哦,修复。奇怪的是,我无法获得第一行/最后一行的语法突出显示…我做错了什么?