如果我在 using 语句结束之前返回会发生什么?会调用 dispose 吗?

2023-12-04

我有以下代码

using(MemoryStream ms = new MemoryStream())
{
     //code
     return 0;
}

The dispose()方法在末尾调用using声明大括号}正确的?自从我return结束之前using声明,将MemoryStream对象是否得到妥善处置?这里会发生什么?


Yes, Dispose将被调用。一旦执行离开范围,它就会被调用using块,无论以什么方式离开该块,无论是该块的执行结束,return声明或异常。

正如@Noldorin 正确指出的那样,使用using代码中的块被编译成try/finally, with Dispose被称为在finally堵塞。例如下面的代码:

using(MemoryStream ms = new MemoryStream())
{
     //code
     return 0;
}

实际上变成:

MemoryStream ms = new MemoryStream();
try
{
    // code
    return 0;
}
finally
{
    ms.Dispose();
}

所以,因为finally保证在之后执行try块已完成执行,无论其执行路径如何,Dispose无论如何,都保证会被调用。

有关更多信息,请参阅这篇 MSDN 文章.

附录:
只是要补充一点警告:因为Dispose保证被调用,确保它几乎总是一个好主意Dispose实现时永远不会抛出异常IDisposable。不幸的是,核心库中有一些类do在某些情况下抛出Dispose叫做——我在看着你,WCF 服务参考/客户端代理! ——当这种情况发生时,如果Dispose在异常堆栈展开期间调用,因为原始异常被吞没,有利于由异常堆栈生成的新异常Dispose称呼。这可能会让人非常沮丧。或者这令人沮丧、疯狂?两者之一。也许两者都有。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果我在 using 语句结束之前返回会发生什么?会调用 dispose 吗? 的相关文章

  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 我应该如何在 VB.NET 中进行转换?

    所有这些都相等吗 在什么情况下我应该选择其中一个而不是其他 var ToString CStr 变量 CType 变量 字符串 DirectCast 变量 字符串 编辑 来自的建议不是我自己 https stackoverflow com
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 检测 SignalR Hub 客户端立即断开连接

    SignalR Hub OnDisconnected 何时在服务器端引发 对于崩溃或关闭而不调用Stop method 我正在使用 SignalR NET 客户端进行测试 而不是 javascript 客户端 如果我打电话给Stop客户端上
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐

  • 查找来自 Service Worker 的活动推送通知的数量

    我已经使用 Service Worker 实现了推送通知 有什么方法可以找出窗口中当前显示的通知数量 我的目的是限制窗口中显示的通知数量 我尝试了以下方法 但 getNotifications 函数返回空数组 self addEventLi
  • Bash shell:如何检查特定的日期格式?

    我有一个 Bash shell 脚本 用于检查 shell 变量是否包含数字 if step 0 9 then exec gt 2 echo error step is Not a step number exit 1 fi 现在我需要执行
  • 如何在微调器中设置下拉箭头?

    我尝试使用下拉箭头设置微调器 但无法修复它 有人可以帮助我吗 我已附上源代码 我的班级文件 import android os Bundle import android view View import android widget Ad
  • Javascript 回调的范围问题

    我在使回调函数正常工作时遇到一些问题 这是我的代码 SomeObject prototype refreshData function var read obj new SomeAjaxCall read some data this re
  • 现有 WOPI 主机?

    我即将实现自己的 WOPI 主机 用于在 iOS 和 Android 上查看和编辑 Office 文档 但我想知道是否已经有任何现有的解决方案 例如 我可以使用 SharePoint 或 OneDrive 文档吗 这是我现有的实现的小列表
  • 具有泛型属性的 LINQ 表达式

    我的问题与此相关 具有通用类属性的 linq 表达式 这次我想获得具有共同 id 的新创建的对象 id 实际上是外键 因此可以有不同的名称 我想出了以下几点 public static IEnumerable
  • 解码的 json 响应返回空结构[重复]

    这个问题在这里已经有答案了 我正在尝试获取 trello 组织成员列表 当我打印结果时 我有正确的结构数量 17 个结构 17 个成员 但结构是空的 这是我的代码 package main import fmt import net htt
  • “cp -t”发生了什么?

    我正在阅读一些使用通配符运算符从目录复制文件但排除一个文件的方法 我看到了cp t与 一起使用时发挥作用find 然而 每当我尝试跑步时cp t I get cp illegal option t 对我来说这意味着提供的标志未实现 这是 b
  • 基准测试代码 - 我做得对吗?

    我想对 C C 代码进行基准测试 我想测量 CPU 时间 挂机时间和周期 字节 我编写了一些测量函数 但在周期 字节方面存在问题 为了获得CPU时间我写了一个函数getrusage with RUSAGE SELF 对于墙上的时间我用clo
  • 如何使用 WS-Security 在 BizTalk Server 中发送签名消息

    我希望 BizTalk 使用 WS Security 发送签名的肥皂消息而不加密 我的编排使用动态发送端口 我已经尝试了这两种方法 尝试像这样配置 WCF WSHttp 发送端口 暂时更改我的编排以使用此端口而不是动态端口 以及在我的编排中
  • 使用 rCharts 在 r 和shiny中创建传单热图

    我正在使用 Ramnath Vaidyanathan 的精彩演示 网址为http rmaps github io blog posts leaflet heat maps index html我想为我闪亮的应用程序重现他的热图 当我尝试在闪
  • 在张量流中使用两种不同的模型

    我尝试使用两种不同的移动网络模型 以下是我如何初始化模型的代码 def initialSetup os environ TF CPP MIN LOG LEVEL 2 start time timeit default timer This
  • 我无法使用 pyaudio 运行简单的代码 - [Errno -9996] 无效的输出设备(无默认输出设备)

    我是Python新手 我正在尝试运行一个关于 pyaudio 的简单代码 我刚刚复制并粘贴了在 pyaudio 网站上找到的代码 我收到此错误 OSError Traceback most recent call last
  • 将常量列表添加到 pandas 列

    假设我有一个 df df pd DataFrame a 1 2 3 b 4 5 6 我想要的只是添加一个新列 c 带有常量列表 例如 7 8 9 10 当我尝试时 df c 7 8 9 10 I get ValueError Length
  • 如何在ConstraintLayout上设置三分之一的布局宽度百分比?

    我想用 3x6 TextView 的二维网格填充屏幕 这意味着每个TextView必须是全屏宽度的1 3 高度是全屏高度的1 6 我对此布局使用 ConstraintLayout 因为 LinearLayout 对此布局来说是不好的做法 因
  • Firebase图片以异步等待方式上传

    async UPLOAD IMAGES try let self this var storageRef firebase storage ref var files document getElementById photoupload
  • 如何将应用程序名称添加到

    这是我的 app config 文件 如下所示
  • 更改 Woocommerce 购物车总数中的小数位数

    在 Woocommerce 中 我已在 Woocommerce 常规设置中将小数位数设置为 7 因此我可以显示产品价格像这样 0 0453321 我想知道我是否可以设置 舍入购物车总计仅保留 2 位小数 类似这样 2 34 正确的方法是仅更
  • 合并两个数组并对最后一个数组进行排序

    在一次采访中 我被问到以下问题 我有两个数组 它们都已排序 BUT 数组 1 将有少量 1 数组 2 的总数将与数组 1 中 1 的总数相同 所以在下面的例子中 array1 有三个 1 因此 array2 有 3 个数字 let say
  • 如果我在 using 语句结束之前返回会发生什么?会调用 dispose 吗?

    我有以下代码 using MemoryStream ms new MemoryStream code return 0 The dispose 方法在末尾调用using声明大括号 正确的 自从我return结束之前using声明 将Memo