Win32.DestroyIcon与Icon.Dispose

Duk*_*ade 5 c# garbage-collection dispose

我有这行代码:

System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
Run Code Online (Sandbox Code Playgroud)

几行之后,在使用图标之后我有了这条线:

Win32.DestroyIcon(shinfo.hIcon);
Run Code Online (Sandbox Code Playgroud)

但是,当对我的代码运行静态分析时,它表示Resource_Leak可能来自图标.我想知道如果我调用dispose方法会有什么不同:

icon.Dispose();
Run Code Online (Sandbox Code Playgroud)

而不是现在正在使用的Win32.DestroyIcon().它们之间有什么区别吗?我只是维护这段代码所以我不确定原始开发人员是否有任何使用Win32.DestroyIcon的特殊内容.

Ree*_*sey 9

静态分析正在触发,因为您没有处置"IDisposable资源".

我建议坚持使用托管版本,并使用icon.Dispose().这将(内部)照顾DestroyIcon你,但始终坚持纯托管API.

Win32.DestroyIcon实际上更适用于您正在接收的图标IntPtr,而不是用于Icon完全由框架管理的实例.

  • 实际上,`icon.Dispose()` 仅在(私有)布尔值 `ownHandle` 为真时才会销毁图标,这取决于托管图标对象的构造方式。具体来说,[`Icon.FromHandle(..)` 将该布尔值设置为 false](https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Icon.cs,3a4e2c70109d46bc) 等等 [` Icon.Dispose()` 什么都不做](https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Icon.cs,8d050d7603efcc48)。 (4认同)
  • 这个答案是错误的。使用“Icon.FromHandle()”时,在生成的图标上调用“Dispose()”**不会**调用“DestroyIcon”,并且会出现资源泄漏。 (3认同)