VB.Net 集合中对象的生命周期

2023-12-01

我试图在下面的代码中找出 tmpTabPages 的生命周期。假设表单有一个名为 MyTabControl 的空 TabControl,并且有一个名为 NameCollection 的字符串集合。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For Each itm In NameCollection
        Dim tmpTabPage as New TabPage(itm.toString)

        'Add Controls to tmpTabPage

        MyTabControl.TabPages.Add(tmpTabPage)
    Next
End Sub

由于 tmpTabPage 的范围是 For/Next 块,因此它的生命周期通常是直到该块的末尾,对吗?但是,由于它被添加到范围在块之外的集合中,因此它是否具有与集合(或者在本例中为 MyTabControl)相同的生命周期?最后,如果我调用 MyTabControl.TabPages.Clear 集合中的 tmpTabPages 是否会被销毁,或者它们只会占用内存?


从 Control 派生的类(包括 TabPage)最重要的是 Dispose() 方法。它们不受自动垃圾收集的影响,Winforms 保留一个内部表,将控件的句柄映射到控件引用。这就是为什么你的主窗体不会突然被垃圾收集,即使你的程序没有保留对它的引用。

将 TabPage 添加到 TabControl 的集合中会负责自动处理。这同样适用于 TabControl,它将添加到表单的 Controls 集合中。正常的事件链是您的程序或用户关闭表单。 Form 类迭代其子控件并调用其 Dispose() 方法。 TabControl 在其 Dispose() 方法中执行相同的操作,处理选项卡页。 Windows 窗口在此过程中被销毁,从该映射表中删除句柄,现在允许垃圾收集器最终收集控件的托管包装器。

有一个令人讨厌的陷阱给许多 Winforms 程序员带来了麻烦。如果您从其父级集合中删除控件,则您有责任自行处置它。删除它确实如此not自动处理它。 Winforms 通过暂时将控件重新设置为名为“停车窗口”的隐藏窗口来保持本机窗口处于活动状态。很好的功能,它允许您将控件从一个父级移动到另一个父级,而无需销毁并重新创建该控件。

但这里的关键词是“暂时”。如果您下次重新设置控件的父级,这只是暂时的。因此它从停车窗口移至新的父窗口。如果你不真正重新调整它的父级,那么它就会永远在停车窗上保持活力。吞噬资源直到程序终止。这也称为泄漏。如果您已经创建了 10,000 个窗口,而 Windows 拒绝创建另一个窗口,则可能会使您的程序崩溃。

ControlCollection.Clear() 方法在这里尤其有害。确实如此not处理掉控制装置,它们都被移到那个停车窗口。如果这不是有意的(很少是这样),您必须自己对它们调用 Dispose()。

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

VB.Net 集合中对象的生命周期 的相关文章

  • 在VB.net中动态添加用户控件

    我在 Vb net Windows 应用程序 中制作了自定义 UserControl 如何将其动态添加到表单中 UserControl 本质上只是另一个类 它继承自 Control 因此您可以使用控件执行各种操作 但除此之外它只是一个类 因
  • windows XP中如何设置默认编码?

    我尝试使用 StreamReader 打开文件并设置编码 但我希望它采用默认 Windows 编码 我如何更改我的 Windows 编码 区域和语言选项控制面板项目 高级选项卡 影响整个计算机
  • 以编程方式设置 IIS 6.0 的服务器绑定

    我正在尝试设置安装程序来注册网站 目前 我已经在 Windows Server 2003 下创建了应用程序池和网站 不幸的是 每当我尝试修改 ServerBindings 属性来设置 IP 地址时 它都会向我抛出异常 我第一次尝试这个是因为
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 打印“X”个字符数与“X”字符串长度的所有可能组合(暴力破解)

    我正在尝试编写一个单词组合生成器 我的意思是打印 X 个字符数与 X 字符串长度的所有可能组合 首先 我需要说的是 我在 StackOverFlow 中看到了一个关于这个问题的问题 其中有很多单词生成器的答案来执行此操作 在不同的语言上 但
  • 使用 TreeMap 和 Comparator 按值对 HashMap 进行排序

    我使用以下代码创建哈希图 然后使用树形图和比较器对哈希图中的值进行排序 然而 输出结果却出乎意料 所以任何关于我做错了什么的想法都会有帮助 Code public static void main String args System ou
  • 回发 Asp.Net 上的动态用户控件

    我创建了一个项目 user control 它有一个文本框 按钮等 它将有意收集用户想要的项目总数 我在 page load 上动态创建了几个 user control 实例 如果您单击项目数量的添加按钮 它将添加到会话变量中 但是 当用户
  • 从 RichTextBox 复制文本及其格式

    如何将 RichTextBox 中的文本及其格式复制到写字板或网络浏览器 就像复制纯文本一样 您可以使用Clipboard SetText method http msdn microsoft com en us library 6eahs
  • VB.NET - 类中的扩展函数?

    我正在尝试创建一个类库 其中包含将二进制整数转换为十进制的函数 反之亦然 这样我就可以将其导入到另一个项目中 而无需重写该函数 它工作得很好 这是课程的一部分 Public Class BinaryDenary Public Shared
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • Activator.CreateInstance 缺少方法异常

    我在 C dll 中有一个类 其中包含以下类 public class RequiredTask Base BaseObject public string Name get set public string Description ge
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • .NET框架,Windows XP

    我们使用 Visual Studio 2012 构建了一个应用程序 它可以在任何 Windows 7 或 Vista 计算机 32 位或 64 位 上完美运行 但是 当我尝试在 Win XP 计算机上运行该应用程序时 我得到以下信息 系统组
  • ASP.NET 验证控件和 Javascript 确认框

    我有一个使用 NET 服务器端输入验证控件的页面 此页面还有一个 javascript 确认框 在提交表单时会触发该确认框 当前 当选择 提交 按钮时 会出现 javascript 确认框 一旦确认 就会触发 ASP NET 服务器端验证控
  • vb.net:查找字符串中字符串的位置?

    vb net 中是否使用 instr 来实现此目的 使用 String IndexOf http msdn microsoft com en us library system string indexof aspx http msdn m
  • 使用 VB.NET 覆盖文本文件中的特定行

    我需要执行以下操作 更改文本文件中的行 Path c this certain path 用这条线 Path c that other newer path 这些路径的长度肯定会不同 因此我需要替换引号中的内容 或者完全擦除该行并输入一个新
  • Java和手动执行finalize

    如果我打电话finalize 在我的程序代码中的一个对象上 JVM当垃圾收集器处理这个对象时仍然再次运行该方法吗 这是一个大概的例子 MyObject m new MyObject m finalize m null System gc 是
  • 为什么 MutexGuard 在结构中需要生命周期参数,但在函数返回类型中不需要? [复制]

    这个问题在这里已经有答案了 我想搬一个MutexGuard大约 返回一个MutexGuard来自函数无需给出生命周期参数即可正常工作 但是 当将防护打包到结构中时 编译器需要防护的生命周期参数 下面的代码编译没有错误 struct Queu
  • 如何捕获 Ctrl + Alt + RShftKey

    For some time I m trying to catch Ctrl Alt Right Shift Key under common VBNET key handler Here are my tests If e Control
  • Gridview 错误:对 Bind 的调用格式不正确

    我有以下 gridview 代码

随机推荐

  • 从 UIImagePickerController 中选取图像后崩溃(与内存泄漏有关?)

    我一直在尝试最小化我的内存占用UIImagePickerController 但我开始认为我遇到的内存问题是由于内存管理不善造成的 而不是处理内存问题的特定方法UIImagePickerController object 我的工作流程是这样
  • 如何枚举给定 Windows 进程上的套接字?

    我需要我的程序来检查给定的 Windows 进程是否正在滥用网络 我想枚举进程 tcp 和 udp 套接字 并查看它们在给定时间段内传输了多少数据 是否有 C 或 Net API 可以提供此类信息 在 Win2k 上 您可以使用 GetTc
  • android.support.v7.widget.AppCompatButton 无法转换为 android.view.ViewGroup

    我正在通过 onclick 按钮替换我的片段 但出现此错误 请帮助 这是我的详细活动片段 public class DetailActivityFragment extends Fragment TextView textView Imag
  • 无法@Override Java中的compareTo()方法

    我正在写一个BankAccount类将一堆银行帐户放入数组列表中 并根据帐号对它们进行排序 我写了compareTo 方法如下 public int compareTo BankAccount another if Integer pars
  • PHPMailer SMTP 配置

    在过去的两个小时里 我一直在网上查看是否有其他人遇到过这个问题 似乎很多人都遇到过 但没有一个答案对我有用 SMTP gt FROM SERVER 220 mx google com ESMTP vq7sm928004oeb 13 SMTP
  • Rust 中的 unwrap 是什么,它有什么用?

    我有这个代码使用 unwrap fn main let paths std fs read dir home user unwrap for path in paths println Name path unwrap path displ
  • Caffe sigmoid交叉熵损失

    我正在使用 sigmoid 交叉熵损失函数来解决多标签分类问题 如下所示本教程 然而 在他们的教程结果和我的结果中 输出预测都在范围内 Inf Inf 而 sigmoid 的范围是 0 1 sigmoid 仅在反向传播中处理吗 也就是说 前
  • 按预定义的值映射对对象数组进行排序[重复]

    这个问题在这里已经有答案了 我有以下数组 inputArray Array 0 gt stdClass Object id gt 8 1 gt stdClass Object id gt 7 2 gt stdClass Object id
  • admob 6.2.1 空指针异常

    我有一个大问题 我想将 admob 集成到我的 android 应用程序中 但是当我尝试将 admob 集成到 xml 文件中时 我在图形布局中遇到空指针异常 java lang NullPointerException at com go
  • Eclipse 插件 - 处理单步或中断时的事件

    是否有从 Eclipse 调试器接收事件通知的通用方法 具体来说 我只想知道用户何时跨过 进入以及何时命中断点 我已经在 J DT 中完成了这个工作 请参阅我的其他问题 Eclipse 调试器事件 但同样的技术在 CDT 中不起作用 我正在
  • 我无法从 RichTextValue 获取文本

    我无法从中获取文本值RichTextValue这是来自日期单元格的 目标表如下所示 date string string 我想从第一个单元格获取文本值 所以我写了这段代码 const dataRange sheet getDataRange
  • 同类指针的区别

    同一类型的两个指针的差值始终为一 include
  • grails 1.3.9 应用程序中的 EHCache 默认值

    grails 1 3 9 应用程序中 ehcache 的默认值是什么 我特别对查询缓存值感兴趣 我通过 postgres 的 psql 删除了几行 但我没有看到我的应用程序中反映的更改 我还没有将 ehcache xml 文件添加到conf
  • 列出 WordPress 标签时删除最后一个逗号

    我有以下脚本来列出没有链接的帖子标签 但它在所有标签 包括最后一个标签 后面放置了一个逗号 有什么方法可以防止脚本向列表中的最后一个标签添加逗号 我尝试研究它 但确实没有太多关于这个特定的 wp 字符串的信息 使用 rtrim 它将修剪最后
  • CoordinatorLayout 状态栏填充在片段事务期间消失

    使用 22 2 1 设计支持库和 API 22 尚未在早期版本上进行测试 我在片段之间切换时遇到了状态栏填充问题 初始片段加载良好 但在片段事务之后 状态栏填充消失 将所有视图推到不应该出现的位置 弹出返回堆栈后 原始片段也会发生同样的情况
  • 如何在 C# 中更新 app.config 连接字符串数据源值?

    Configuration config ConfigurationManager OpenExeConfiguration ConfigurationUserLevel None config ConnectionStrings Conn
  • Chrome 网络开发工具中的“状态代码:200 OK(来自 ServiceWorker)”?

    我熟悉 http 状态代码 但最近我在 chrome 调试器中看到了一条奇怪的行 而不是普通的Status Code 200 OK我看到了以下内容 Status Code 200 OK from ServiceWorker 我的猜测是 这只
  • iOS:将ObjC代码转换为C#,如何知道应用程序空闲的时间

    我是 iOS 开发新手 我使用 monotouch 来开发 iOS 应用程序 我想知道应用程序空闲的时间 我得到了 ObjC 代码 但无法将其转换为 c 这是代码 void sendEvent UIEvent event super sen
  • 网页抓取提取 Javascript 表 Selenium+Python

    我读过几篇关于网页抓取的文章 但我不明白如何在网站中查找元素 我想要废弃表格的网站如下 http www bmfbovespa com br pt br servicos market data cotacoes mercado de de
  • VB.Net 集合中对象的生命周期

    我试图在下面的代码中找出 tmpTabPages 的生命周期 假设表单有一个名为 MyTabControl 的空 TabControl 并且有一个名为 NameCollection 的字符串集合 Private Sub Form1 Load