C# 使用WinForms控件中的SystemEvents为具有静态方法的类处置模式

C# 使用WinForms控件中的SystemEvents为具有静态方法的类处置模式,c#,.net,winforms,idisposable,systemevent,C#,.net,Winforms,Idisposable,Systemevent,我有一个WinForms控件,其中一些UI元素是使用内部类的静态方法绘制的-类似于: 内部类DrawUIElement { 公共静态空心绘图箭头(图形g,矩形矩形) { //在图形g上绘制一些东西 } } 现在我需要修改这个类以支持高分辨率屏幕。该类的改进版本将根据屏幕分辨率绘制UI元素。这意味着我需要根据屏幕的当前DPI进行一些计算,并在DPI改变时重新计算。我打算利用这次活动来实现这一点。我将在DrawUIElement类的构造函数中添加一个事件处理程序,并在事件处理程序中DPI发生更改时

我有一个WinForms控件,其中一些UI元素是使用内部类的静态方法绘制的-类似于:

内部类DrawUIElement
{
公共静态空心绘图箭头(图形g,矩形矩形)
{
//在图形g上绘制一些东西
}
}
现在我需要修改这个类以支持高分辨率屏幕。该类的改进版本将根据屏幕分辨率绘制UI元素。这意味着我需要根据屏幕的当前DPI进行一些计算,并在DPI改变时重新计算。我打算利用这次活动来实现这一点。我将在DrawUIElement类的构造函数中添加一个事件处理程序,并在事件处理程序中DPI发生更改时执行所有必需的重新计算:

static DrawUIElement()
{
Microsoft.Win32.SystemEvents.DisplaySettingsChanged+=SystemEvents\u DisplaySettingsChanged;
}
私有静态无效系统事件\u显示设置更改(对象发送方,事件参数e)
{
//根据新屏幕DPI重新计算内部参数
}
此WinForms控件已创建使用类似事件的某些类的实例。这些类从
IDisposable
模式中实现
Dispose()
方法,以释放对SystemEvents\u UserPreferenceChanged事件处理程序的引用,以避免在关闭带有控件的窗体时发生资源泄漏


问题是:我是否还需要将
Dispose()
方法添加到DrawUIElements类中,该类将从SystemEvents.DisplaySettingsChanged事件处理程序中分离SystemEvents.DisplaySettingsChanged事件处理程序以避免资源泄漏,或者在只包含静态方法的类中不必担心此问题?

Dispose()意味着在GC开始之前提前释放资源。在应用程序的生命周期中,您需要收听该事件。这是一个特性,不是资源泄漏。在应用程序终止前一毫秒内处理任何内容都没有意义。如果在应用程序运行时忘记取消订阅静态事件,可能会导致内存泄漏。但没有必要进行处置actually@PavelAnikhouski,据我所知,实际上,在应用程序的生命周期中,内存中只有一个DrawUIElement类的实例。如果我将在SystemEvents\u DisplaySettingsChanged事件处理程序中重新计算该类的一些静态整型/浮点型字段,则不会发生任何错误-对吗?@HansPassant,这个带有SystemEvents\u DisplaySettingsChanged事件处理程序始终处于活动状态的体系结构是否可以防止可视控件在包含它的窗体关闭时正确销毁/释放?@TecMan是的,可以。若您忘记取消订阅活动,在不需要的时候,您可能会收到一些泄漏。但似乎在应用生命周期的所有时间都需要
显示设置更改