【问题标题】:Disposing of custom in-memory controls in a form [duplicate]以表单处理自定义内存控件[重复]
【发布时间】:2019-10-08 06:45:41
【问题描述】:

我有一个Form(嗯,我的窗口,它继承自Form),我想在其中创建一些控件,然后在这个类的整个代码中引用它们。

所以我创建了字段:

private Label _someCounter;
private Label _someAnotherCounter;

我初始化它们,随心所欲地使用它们,这很棒。

但我还需要记住处置它们,问题是:我该怎么做?我可以想到三种方式:

  1. 我在Dispose override 方法中编写了更多代码,由设计师生成(因为设计师可能会在一段时间内覆盖它,我不喜欢这个想法)。

  2. 我在一个类中找到了copmonents字段,该字段是通过生成的Dispose覆盖进行处理的,所以我只是将这些控件添加到copmonents集合中,因此它们会自动处理。

    李>
  3. 毕竟,我也是这么想的,毕竟我将它们添加到我的界面中,所以无论如何它们都会添加到component。所以我什么都不用做。

【问题讨论】:

  • 看看这篇文章:docs.microsoft.com/en-us/dotnet/standard/garbage-collection/…。它解释了如何实现IDisposable,还提到了在继承已经实现IDisposable的基类时如何处理。
  • 我认为你不需要做任何事情。如果您将控件添加到某个容器的控件集合中(您应该这样做以查看它们),那么该容器将在释放时释放其所有子级。您可以在 Control.Dispose method 的参考源中看到该逻辑
  • 请注意,只有#region Windows Form Designer generated code区域中的代码在构建时被重新生成——而不是整个Form.designer.cs文件,所以修改它的其余部分是安全的(包括@987654334 @)。但我认为史蒂夫的评论是正确的。
  • @HenrikHansen 您不应修改 Designer.cs 文件。除非您仔细了解自己在做什么,例如重命名或更改类型(例如,您可能希望将标签更改为复选框),或者如果您想通过代码快速编辑控件属性,或者如果您的重构或修复编译错误其他地方破坏了这个文件。
  • @OlivierRogier:你真的不是在读,我在写什么。修改Dispose(bool disposing) 是非常安全的,如果您的表单中有想要手动处理的对象,您应该使用它:-)

标签: c# winforms controls dispose


【解决方案1】:

好的,所以你可以创建虚拟类:

public class MyLabel : Label
{
  protected override void Dispose(bool disposing)
  {
    base.Dispose(disposing);
  }
}

你可以在Dispose方法中设置断点。

将字段的类型更改为MyLabel 并检查是否调用了该方法,并且在没有我显式调用它们或执行任何操作的情况下调用它。

所以第三种方式是正确的 - 因为它们是作为Form 控件添加的,所以它们会被自动处理掉。

【讨论】:

  • 这是我的假设,但我懒得检查。 :-)
  • @OlivierRogier 我认为他这样做只是为了检查 Winforms 引擎自动调用 Dispose 的假设。他确认它是自动调用的。
  • @OlivierRogier 这段代码只是为了测试和解决问题,我不会坚持。
  • @Olivier OP 还能如何验证所做的假设?你能推荐一个更好的方法来验证它吗?
  • 其实你说的很对。对不起。这些天我很痛苦,我读得太快了。所以有点照顾我。我真的必须更加小心。所以你的回答很棒。再次抱歉。赞成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多