Form.ShowDialog() 并处置

2024-03-31

如果我有这样的方法:

public void Show()
{
   Form1 f = new Form1();
   f.ShowDialog();
}

我还需要调用 dispose 吗即使它将超出范围,也将符合垃圾回收的条件。

从一些测试来看,多次调用此 Show() .. 在某些时候,GC 似乎会收集它,因为我可以看到内存激增,然后在某个时间点它会下降。

从 MSDN 看来,当不再需要表单时,您必须调用 dispose。


往往会发生的情况是,如果该物品纯粹是managed资源,调用dispose不一定required, 但是强烈建议因为它使处置确定性的。它并不总是必需的(从技术意义上来说),因为这些托管资源本身现在可能有资格进行 GC,或者默认情况下实际上没有什么可处置的,这是一个可扩展点。

For 不受管理的资源,处置模式 http://www.codeproject.com/Articles/15360/Implementing-IDisposable-and-the-Dispose-Pattern-P建议实施终结器,它将在 GC 上调用。如果类型没有实现终结器并且没有调用 dispose,那么它是possible(嗯,很有可能)资源将得不到处理。终结器是运行时提供的最后一次清理你的东西的机会 - 它们也是有时间限制的。

注意,它does not使 GC 或托管内存回收具有确定性,处置是not delete来自 C++。废弃的物品距离真正被收集可能还有很长的路要走。然而,在托管世界中,您不关心确定性收集,只关心资源管理 - 换句话说,处置。

也就是说,我总是确保调用 Dispose 或使用using声明类型是否是一次性的,不管是否使用托管资源或非托管资源 - 这是预期的约定:

public void Show()
{
    using (var f = new Form1())
    {
        f.ShowDialog();
    } // Disposal, even on exceptions or nested return statements, occurs here.
}

Update:

在与 Servy 讨论后,我觉得我必须表达这一点,作为我建议尽可能处置的理由。如果是MemoryStream,明明是一次性的类型,但实际上目前并没有处理任何东西。

然而,依靠这一点,就等于依靠执行 of MemoryStream。如果将其更改为包含非托管资源,则这将意味着依赖于MemoryStream没有任何东西可以处理就会成为问题。

在可能的情况下(如IDisposable)我更喜欢依赖公共合同。在这种情况下,按照合同进行工作意味着我不会受到底层实施更改的影响。

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

Form.ShowDialog() 并处置 的相关文章

随机推荐

  • 是否可以制作带有 UL/LI 且无图像的滑块? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 因此 我在谷歌上寻找滑块教程 我发现了很多 但都是图像 我想知道是否可以用 ul 元素制作一个没有图像的滑块 例如 UL 的宽度为 300
  • asp.net 自定义 HttpHandler 和 URL 路由

    我想通过自定义 HttpHandler 处理对我的应用程序 http example com whateverpath 的请求 但返回的内容取决于 whateverpath 的值 因此 访问 http example com path1 的
  • 禁用所选文件的“文档注释”警告

    Xcode 能够检查文档注释问题 并在出现问题时报告警告 例如 我使用 CocoaPods 将 Facebook SDK 添加到我的项目中 在文件中的某个时刻FBError h有以下代码 typedef NS ENUM NSInteger
  • 如何使用 sqlplus 或 sql Developer 云连接连接到 Azure Oracle 12c 数据库

    我在 azure 中有 2 个虚拟机 一个是数据库服务器 另一个是 Web 服务器 我可以获得这些服务器的远程桌面连接 并且 Web 服务器可以连接到数据库 sqlplus user password internal network ip
  • jsTree通过ajax加载子节点

    下面发布的代码通过 ajax 请求加载我的树的根元素 我的树非常大 因此我无法一次加载所有项目 因此我需要通过请求子级提供特定 ID 来加载元素 如何通过点击节点通过ajax加载元素 jstree demo div jstree plugi
  • Bootstrap 3 导航下拉菜单

    我使用带有下拉菜单的导航栏 Bootstrap 3 我调整浏览器窗口的大小 我打开菜单 我调整浏览器窗口大小 gt 767px 我打开下拉菜单 在导航栏中 问题 下拉菜单中出现滚动条 见下图 我的 nav 元素是相对位置
  • Mongod 错误:98 无法锁定文件:/data/db/mongod.lock 资源暂时不可用。 mongod 实例是否已在运行?

    2017 06 12T13 06 18 407 0300 I 存储 initandlisten initAndListen 中出现异常 98 无法锁定文件 data db mongod lock 资源暂时不可用 mongod 实例是否已在运
  • 角度材质垫 - 根据最长选项宽度选择宽度

    我有一个带有选项的垫选择 我希望将其内联设置为文本 并且下拉菜单的长度与最长的选项一样长 我可能可以使用 js css vanilla 风格进行一些黑客攻击 但正在寻找更好的解决方案 有什么想法吗
  • Dart:如何创建一个空列表作为默认参数

    我有多个列表 如果没有为它们分配任何内容 则默认情况下它们需要为空 但我收到这个错误 class Example List
  • 如何覆盖 tdalign="center"?

    据收集自为什么align center 不覆盖 text align right https stackoverflow com questions 2546857 why aligncenter not overriding on tex
  • 什么是同步和异步方法?

    什么是同步方法 什么是异步方法 同步方法和异步方法有什么区别 什么时候必须使用同步或异步方法 我问这些问题是因为我不明白 public async void ReadData filepath CreateDoc hello lt Why
  • GWT Dev 模式和外部服务器出现间歇性序列化异常

    我有一个 GWT 应用程序 它在开发模式下与 GWT 的嵌入式码头服务器完美运行 但是 我需要转向使用外部码头服务器 出于各种原因 我遵循了 GWT 文档编译与调试 http www gwtproject org doc latest De
  • 致命错误:从无效上下文调用 private MyObject::__construct()

    在 PHP 中创建新对象时 我收到以下错误消息 Fatal error Call to private MyObject construct from invalid context我只是创建新对象 而不尝试显式调用构造函数 有谁知道发生了
  • 使用嵌入文本文件中的 File.ReadAllLines

    我一直在应用迄今为止在 Bob Tabors 绝对初学者系列中学到的知识 并为我女儿编写了一个小型控制台文字游戏 需要我生成一个随机的 5 个字母单词 我以前使用过File ReadAllLines path 从我的系统上的文本文件 wor
  • 如何限制谁可以在 github 存储库上合并为 master?

    我在我的 Github 存储库上进行了设置 主分支检查 激活 以下内容的分支保护规则 合并前需要审查请求请求 所需批准审稿人 1 包括管理员 限制谁可以推送到匹配的分支 然后我面临的情况是 团队中至少有一个人必须批准 PR 然后有人才能将自
  • 将Python源代码拆分到单独的目录中?

    以下是我的公司 foo com 使用的一些各种 Python 包 com foo bar web com foo bar lib com foo zig web com foo zig lib com foo zig lib lib1 co
  • 在函数内用 $ 索引数据框?

    许多 R 教科书鼓励使用 从 data frames 检索变量 列 但是 我发现这在函数内部不起作用 我不明白为什么 data BOD print BOD These work BOD demand BOD demand This work
  • 以特定格式将数据存储在txt文件中

    我的问题与我之前的问题相关 如何以特定格式显示txt文件中的数据 https stackoverflow com questions 731917 how to display data from txt file in specific
  • jQuery UI 选项卡禁用选项卡导航

    我尝试使用禁用选项卡导航 var tabs tabs tabs select function event ui return false 但是 这也会禁用我用于导航的流链接 input nexttab click function var
  • Form.ShowDialog() 并处置

    如果我有这样的方法 public void Show Form1 f new Form1 f ShowDialog 我还需要调用 dispose 吗即使它将超出范围 也将符合垃圾回收的条件 从一些测试来看 多次调用此 Show 在某些时候