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

标签 c# reflection resources reference resourcemanager

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

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

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

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

最佳答案

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

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

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

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

相关文章:

c# - 如何获取 ElasticSearch 索引中的现有映射

加载 DLL 期间出现 C# 异常。找不到解决方法

java - 使用 jar 文件中的资源?

wpf - 最佳实践 WPF Prism 资源

wpf - 将 LocBaml 和资源合并到单个卫星组件中

c# - 在 TeamCity 中运行 nUnit 测试时出现错误的 CurrentCulture

c# - 如何在 Main() 方法之前在 C# 中运行静态初始化方法?

c# - 如何从 WinRT 中的 TypeInfo 获取类型?

c# - ASP.NET MVC3 服务层 - 每个服务有多个存储库?

php - 获取类中声明的所有公共(public)方法,不继承