如何将Dispose功能添加到C#UserControl?

e-h*_*der 59 c# user-controls dispose

我有一个实现UserControl的类.在.NET 2005中,在MyClass.Designer.cs部分类文件中自动创建一个Dispose方法,如下所示:

  protected override void Dispose(bool disposing)
  {
     if (disposing && (components != null))
     {
        components.Dispose();
     }
     base.Dispose(disposing);
  }
Run Code Online (Sandbox Code Playgroud)

如果我想添加自己的Dispose功能,我会把它放在哪里?由于生成了这个文件,我不想在这里添加代码并冒着被吹走的风险.

小智 70

所有Component类都实现一个Disposed事件.您可以为该事件添加事件处理程序并清理其中的内容.

例如,UserControl您可以添加以下方法:

private void OnDispose(object sender, EventArgs e)
{
    // do stuff on dispose
}
Run Code Online (Sandbox Code Playgroud)

在构造函数(或Load事件处理程序)中添加以下行:

Disposed += OnDispose;
Run Code Online (Sandbox Code Playgroud)

  • 我相信,事件应该从课外处理,而不是从内部处理.我想,任何人都可以用自己的事件覆盖事件处理程序,并防止资源被释放.处理控件内部事务的正确方法是覆盖基类提供的正确虚方法. (7认同)
  • 如果你需要在控件的组件上执行逻辑,比如BindingSource,那么使用Disposed事件将无法解决问题 - 那时组件已经被处理掉了.控制Dispose方法似乎是完全控制流量的唯一方法.在我的情况下,必须调用BindingSource.Clear()来强制内部生成的BindingList分离PropertyChanged事件处理程序并防止内存泄漏. (5认同)
  • 因为`void Dispose(bool disposing)`中`disposing`参数传递的信息无法通过`Disposed`事件访问(或者至少我找不到它;`Control.Disposing`成员的文档不表示它共享`disposing`参数的语义.因此,只有非托管资源可以通过`Disposed`事件安全地处理掉. (4认同)
  • @Jacob Seleznev:不确定为什么更多的人没有赞成这一点.也许他们没有看到它?我认为Disposed事件是向任何支持它的类添加处理功能的正确方法. (2认同)

Mic*_*tov 53

在这种情况下,我将生成的Dispose方法移动到主文件并扩展它.Visual Studio尊重这一点.

另一种方法是使用部分方法(C#3.0).

  • 由于MyClass.Designer.cs文件已经是部分文件,因此您只需将所需的逻辑添加到已生成的Dispose方法即可.Visual Studio在创建后不会覆盖该方法,因此您可以安全地修改它. (10认同)
  • 部分方法在此方案中不起作用. (3认同)

Mic*_*cah 7

我相信在这种情况下代码生成器会尊重您的代码.把它放在代码隐藏中应该是安全的.


akm*_*mad 6

在VS 2005(和2008)中,您可以更新Dispose方法,当您从设计器编辑控件时,它不会被删除.