如果没有要写的话,如何阻止StreamWriter不创建文件?

Har*_*rma -2 .net c# io

如果在使用语句中使用了Stream Writer,则即使没有要写的内容,Stream Writer也会创建一个文件,Reason在块的末尾使用块调用dispose方法.

代码是

using (StreamWriter sw = new StreamWriter(@"d:\abc.txt"))
{

}
Run Code Online (Sandbox Code Playgroud)

如果没有什么可写的,我不会创建空白文件.我正在寻找的原因是我们有条件地写日志.

xan*_*tos 5

你可以这样写:

Lazy<StreamWriter> sw = new Lazy<StreamWriter>(() => new StreamWriter(@"d:\abc.txt"));

try
{
    if (something)
    {
        sw.Value.WriteLine("Foo");
    }
}
finally
{
    if (sw.IsValueCreated)
    {
        sw.Value.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Lazy<T>封装StreamWriter.

你甚至可以封装Lazy<T>到"处理" IDisposable:

public sealed class DisposableLazy<T> : Lazy<T>, IDisposable where T : IDisposable
{
    public DisposableLazy(Func<T> valueFactory) : base(valueFactory)
    {
    }

    // No unmanaged resources in this class, and it is sealed.
    // No finalizer needed. See http://stackoverflow.com/a/3882819/613130
    public void Dispose()
    {
        if (IsValueCreated)
        {
            Value.Dispose();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

using (DisposableLazy<StreamWriter> sw = new DisposableLazy<StreamWriter>(() => new StreamWriter(@"d:\abc.txt")))
{
    if (something)
    {
        sw.Value.WriteLine("Foo");
    }
}
Run Code Online (Sandbox Code Playgroud)