C# 处理窗体中的自定义内存中控件

C# 处理窗体中的自定义内存中控件,c#,winforms,controls,dispose,C#,Winforms,Controls,Dispose,我有一个表单(我的窗口,它继承自表单),我想在其中创建一些控件一次,然后在这个类的整个代码中引用它们 因此,我创建字段: private Label _someCounter; private Label _someAnotherCounter; 我初始化它们,根据我的需要使用它们,这很好 但我也需要记住如何处置它们,问题是:我该怎么做?我可以想出三种方法: 我在设计器生成的Disposeoverride方法中编写了更多的代码(因为设计器可能会在某个时候覆盖它,我不喜欢这个想法) 我在一个类中

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

因此,我创建字段:

private Label _someCounter;
private Label _someAnotherCounter;
我初始化它们,根据我的需要使用它们,这很好

但我也需要记住如何处置它们,问题是:我该怎么做?我可以想出三种方法:

  • 我在设计器生成的
    Dispose
    override方法中编写了更多的代码(因为设计器可能会在某个时候覆盖它,我不喜欢这个想法)

  • 我在一个类中找到了
    copmonents
    字段,该字段由Generated
    Dispose
    override处理,因此我只需将这些控件添加到
    copmonents
    集合中,就可以自动处理它们

  • 毕竟,我也在想,毕竟我把它们添加到了interafce中,所以它们被添加到
    组件中。所以我什么都不需要做


  • 好的,您可以创建虚拟类:

    public class MyLabel : Label
    {
      protected override void Dispose(bool disposing)
      {
        base.Dispose(disposing);
      }
    }
    
    您可以在
    Dispose
    方法中设置断点

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


    因此,第三种方法是正确的-因为它们是作为
    表单添加的
    控件,所以它们会自动被禁用。

    这是我假设的,但我太懒了,没有检查。:-)@OlivierRogier我认为他这样做只是为了验证Winforms引擎自动调用Dispose的假设。他有确认它是自动调用的。@OlivierRogier此代码只是为了测试它并解决问题,这不是我会坚持的东西。@Olivier还有什么方法可以验证所做的假设?你能建议一个更好的方法来验证它吗?事实上,你是非常正确的。我很抱歉。这些天我很痛苦,我读得太快了。所以我会照顾我一点。我真的必须更加小心。所以你的答案很好。再次抱歉。向上投票。请看这篇文章:。它解释了如何实现
    IDisposable
    ,还提到了继承已经实现了
    IDisposable
    的基类时如何处理。如果将控件添加到某个容器的控件集合中(您应该这样做才能看到它们),那么容器在释放时将释放其所有子控件。您可以在referencesource中看到该逻辑,请注意,只有在生成时重新生成的区域
    #区域Windows窗体设计器生成的代码
    ,而不是整个Form.Designer.cs文件,因此可以安全地修改其余部分(包括
    Dispose(bool disposing)
    )。但我认为史蒂夫的评论是对的。@HenrikHansen您不应该修改designer.cs文件。除非您仔细了解自己的操作,例如重命名或更改类型(例如,您可能希望将标签更改为复选框),或者如果您希望通过代码快速编辑控件属性,或者如果重构或其他操作破坏了此文件,则修复编译错误。@OlivierRogier:您真的没有阅读,我正在编写的内容。修改
    Dispose(bool disposing)
    是完全安全的,如果表单中有要手动处理的对象,则应该使用它:-)