Properties.Resources 是否返回新对象

Does Properties.Resources returns a new object

提问人:Tomingsun 提问时间:11/16/2023 更新时间:11/16/2023 访问量:43

问:

在这个回答中,汉斯·帕桑特提到:

Project > Properties > Resources 在这个故事中是值得注意的。它提供了非常方便的语法,可以在程序中使用位图资源。但这很危险,几乎没有人意识到,每次他们在代码中使用 Properties.Resources.Somename 时,他们都会得到一个必须释放的全新 Bitmap 对象。

但是检查内部实现,我发现是这样的:ResourceManager.GetObject

// namespace System.Resources.ResourceSet
private object GetObjectInternal(string name)
{
    if (name == null)
    {
        throw new ArgumentNullException("name");
    }

    Hashtable table = Table;
    if (table == null)
    {
        throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_ResourceSet"));
    }

    return table[name];
}

我怀疑这里缓存了资源,这与汉斯所说的恰恰相反。Hashtable

我的问题是:

  1. 每次都返回一个全新的对象吗?Properties.Resources.Somename
  2. 即便如此,GC 仍将处理不再使用的对象。只要我没有足够快地获取占用内存的对象,我想这不会有问题吗?DisposableProperties.Resourses
C# .NET WinForms

评论

1赞 Flydog57 11/16/2023
对不起,GC 从不释放对象。IDisposable 没有什么神奇之处 - 在类上编写 Dispose 方法,并在管理的对象上调用 Dispose 方法。如果一个类有一个(又名析构函数)并且没有被抑制,那么 GC 机制会将其排队等待以后的调用IDisposableFinalizer
0赞 jmcilhinney 11/16/2023
没有必要问我们它是否每次都返回一个新对象。只需获取两次属性值并进行比较即可查看它们是否是同一对象。您永远不需要问我们一些您可以自己测试的事情。
0赞 jmcilhinney 11/16/2023
至于处置,这是你在代码中做的事情。GC 将最终确定尚未释放的对象,但如果不显式释放,则执行完全清理将需要更长的时间。请注意,释放确实会回收内存,但这确实意味着 GC 可以更快地回收对象占用的内存。当你完成它时,只要处理掉你能做的一切,你就知道不必怀疑你是否在某个地方做错了什么。
0赞 Tomingsun 11/16/2023
@jmcilhinney 公平地说,我得到了两次资源,它们确实是两个不同的对象。我最好创建一个新的静态类来自己缓存对象。
0赞 Tomingsun 11/16/2023
@Flydog57感谢您的提醒,我对 GC 和 .IDisposable

答:

2赞 Tomingsun 11/16/2023 #1

对这个问题投反对票是合理的,我只想澄清一下:

  1. Hans 是对的,它确实返回了一个全新的对象。
  2. 忽略我在问题中发布的内容,GC并且没有必要的关系。IDisposable