C# - 获取对对象的引用数

标签 c# reflection resources reference resourcemanager

我正在尝试为我正在编写的小爱好游戏编写一个简单的资源管理器。这个资源管理器需要做的任务之一是卸载未使用的资源。我可以想到用两种方式做到这一点:

  • 当一个对象不再需要 引用资源,它必须 调用资源管理器的方法 表示不再使用它; 或者

  • 当一个对象不再需要 引用资源,它只是 将其设置为空。然后当 要求资源管理器卸载 未使用的资源,它得到 的引用计数(通过反射?) 每个资源。如果引用计数 是一个(资源管理器将 有对资源的引用), 卸载资源。

有没有办法在 C# 中实现第二个解决方案? 谢谢。

最佳答案

一些事情。首先,对象不被引用计数;引用计数方案存在循环引用问题,即两个对象相互引用但无法访问,从而导致泄漏。 .NET 使用不使用引用计数的标记清除方法。

其次,虽然使用弱引用的建议并不可怕,但也不是灌篮高手。出于性能原因,您正在构建缓存。 (我假设您对应用程序性能特征的仔细、经验和现实的研究已经令人信服地证明了缓存策略对于实现可接受的性能是必要的;如果不是这种情况,那么您就过早地做出了这些决定。)缓存必须有一个关于何时释放其资源的政策,否则就是内存泄漏。

您怎么知道 GC 策略和您的策略是等效的策略? GC 的设计并未考虑到您的特定性能需求。也就是说,它旨在释放真正是垃圾的资源,而不是为了实现您想到的任何特定性能目标。通过将决定委托(delegate)给 GC,您将放弃根据性能需求调整缓存策略的能力。

关于C# - 获取对对象的引用数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24057067/

相关文章:

c# - 使用 Token 获取信息。 OAuth

c# - 使用 C# 在 ASP.NET 中解码条码图像

java - 从代码创建新类

c# - TypeDescriptor.GetProperties 与 Type.GetProperties

java - 类型为 null 的参数应显式转换为 Class<?>[] 以调用 varargs 方法

android - Android 布局配置 - API 级别

JavaScript 与 WebBrowser 控件 C#

c# - cefSharp ChromiumWebBrowser 大小到页面内容

android - 如何保护Android应用APK的..res/raw/文件夹中的视频?

android - 从 Resources 对象中检索所有 Drawable 资源