You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Properties.Resources是否每次返回新对象?GC相关技术疑问

关于Properties.Resources资源使用的两个疑问解答

1. Properties.Resources.Somename是否每次都会返回全新的对象?

是的,每次调用都会返回全新的Bitmap对象。你看到的ResourceSet.GetObjectInternal里的Hashtable缓存的是资源的原始序列化数据(比如字节流),而非已经实例化好的Bitmap对象。

Properties.Resources的自动生成代码中,每个资源属性的getter逻辑是:先通过ResourceManager获取缓存的原始数据,再基于这些数据实例化出一个新的Bitmap对象。所以每次调用Properties.Resources.Somename都会生成全新实例,Hans的说法是正确的。

2. 即便如此,GC会回收不再使用的Disposable对象,只要不通过Properties.Resources过快地获取对象导致内存耗尽,是否就不会有问题?

不是的,这里的核心风险不在托管内存,而在非托管资源。Bitmap属于GDI+对象,内部包含有限的非托管GDI句柄(系统对这类句柄的数量有明确上限)。

虽然GC最终会通过终结器(Finalizer)回收这些非托管资源,但终结器的执行时机完全不确定——很可能在你耗尽GDI句柄之后才会触发。如果频繁调用Properties.Resources.Somename创建Bitmap却不手动释放,很快就会耗尽系统GDI句柄,导致程序抛出“GDI+中发生一般性错误”这类异常,此时托管内存可能还远未耗尽。

正确的做法是:每次获取Bitmap后,在不再使用时手动调用Dispose(),或者用using语句包裹对象,确保非托管资源被及时回收。


内容的提问来源于stack exchange,提问作者Tomingsun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:00:33