多个 using 声明抛出 'IOException' 但语句在写入文件时不会抛出
Multiple using declarations throw 'IOException' but statements don't when writing files
using
声明刚刚在 C# 8.0
中引入,但它们的行为与 using
块不同,我认为是这样。
以下嵌套 using
块工作正常:
using (var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey))
using (var file = new FileStream(path, FileMode.Create, FileAccess.Write))
{
resource?.CopyTo(file);
}
但是当我如下转换为 using
声明时,我得到一个 IOException
表示该文件正在被另一个进程使用:
using var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey);
using var file = new FileStream(path, FileMode.Create, FileAccess.Write);
resource?.CopyTo(file);
我想了解有什么不同 how\when 使用新的 using
声明?
两者 using 声明的不同之处在于它们解析范围的方式。
Old Using 用于使用大括号定义自己的范围,
using var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey);
using (var file = new FileStream(path, FileMode.Create, FileAccess.Write))
{
resource?.CopyTo(file);
}
此处资源和文件都将在找到右大括号时被释放。
有了,新的声明如果你没有像上面那样定义一个作用域,它会自动附加到最近的作用域,
void certainMethod()
{
using var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey);
using var file = new FileStream(path, FileMode.Create, FileAccess.Write);
resource?.CopyTo(file);
}
这里当certainMethod
的方法调用结束时,将调用资源和文件的Dispose。
编辑:对于你的情况,
如果您的代码只是这样做,应该没有任何问题,但是如果有两个这样的块,第一个会工作,但第二个会失败,
例如,
void certainMethod()
{
using var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey);
using var file = new FileStream(path, FileMode.Create, FileAccess.Write);
resource?.CopyTo(file);
using var oneMoreFile = new FileStream(path, FileMode.Create, FileAccess.Write);
//This will fail
resource?.CopyTo(oneMoreFile );
}
using
声明刚刚在 C# 8.0
中引入,但它们的行为与 using
块不同,我认为是这样。
以下嵌套 using
块工作正常:
using (var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey))
using (var file = new FileStream(path, FileMode.Create, FileAccess.Write))
{
resource?.CopyTo(file);
}
但是当我如下转换为 using
声明时,我得到一个 IOException
表示该文件正在被另一个进程使用:
using var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey);
using var file = new FileStream(path, FileMode.Create, FileAccess.Write);
resource?.CopyTo(file);
我想了解有什么不同 how\when 使用新的 using
声明?
两者 using 声明的不同之处在于它们解析范围的方式。 Old Using 用于使用大括号定义自己的范围,
using var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey);
using (var file = new FileStream(path, FileMode.Create, FileAccess.Write))
{
resource?.CopyTo(file);
}
此处资源和文件都将在找到右大括号时被释放。
有了,新的声明如果你没有像上面那样定义一个作用域,它会自动附加到最近的作用域,
void certainMethod()
{
using var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey);
using var file = new FileStream(path, FileMode.Create, FileAccess.Write);
resource?.CopyTo(file);
}
这里当certainMethod
的方法调用结束时,将调用资源和文件的Dispose。
编辑:对于你的情况, 如果您的代码只是这样做,应该没有任何问题,但是如果有两个这样的块,第一个会工作,但第二个会失败, 例如,
void certainMethod()
{
using var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(serviceKey);
using var file = new FileStream(path, FileMode.Create, FileAccess.Write);
resource?.CopyTo(file);
using var oneMoreFile = new FileStream(path, FileMode.Create, FileAccess.Write);
//This will fail
resource?.CopyTo(oneMoreFile );
}