c# - 多个 using 声明抛出 'IOException' 但写入文件时语句不会抛出 0x104567910

标签 c# using-statement

using 声明刚刚在 C# 8.0 中引入,但它们的行为与 using block 不同,至少我是这么认为的。

以下嵌套的 using block 工作正常:

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

我想了解有何不同以及如何\何时使用新的 using 声明?

最佳答案

两种 using 声明的不同之处在于它们解析范围的方式。 旧的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。

编辑:对于你的情况, 如果您的代码只是这样做,那么就不应该有任何问题,但是如果有两个这样的 block ,第一个将工作,但第二个将失败, 例如,

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

    }

关于c# - 多个 using 声明抛出 'IOException' 但写入文件时语句不会抛出 0x104567910,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57175314/

相关文章:

c# - 当我的页面从服务器获取数据时,如何在屏幕上显示简单的加载消息?

c# - 如何在没有 DynamicInvoke 的情况下编译 MethodCallExpression?

c# - 如何将 OGG 音频文件打包到 RIFF 容器?

.net - 关闭读取器时,处置数据上下文会导致调用 Read 的尝试无效

c# - 在单个 'IDisposable' 语句中嵌套 'using'

.net - 为什么我的 FileStream 对象在我 "using"是 BinaryReader 对象时被处理?

c# - 这个异步任务方法有什么问题?

c# - 在类而不是类的集合上使用 foreach

c# - 使用 Reflection.Emit 发出 "using (x) { ... }" block ?

c# - C#中 "using"有什么用?