0

我有一个许可证项目(数据库交互项目),我想从从数据库加载数据的表单中删除所有引用,因为我加载了大量数据并且内存使用率很高。我分析了应用程序(.Net Memory Profiler,Ants)并获得了连接到该表单的引用:

Module1.cs / Class1 -> Module2.cs / Class2 with the reference ref 1 written on the arrow

我必须在不进行重大更改的情况下删除它们,并且该程序应该仍然可以工作:)。如果我将引用设置为 null 程序会崩溃,因为它可能会再次需要这些引用 问题是,我认为,显示的引用可以在与 Profiler 显示的模块不同的模块中声明,从而使其更难遵循。

在 Data.cs 我有Data类并在其中声明

mVController = table.Resolve<ImVController>();

mVController - 属于类型ImVController(与名称无关) table - 属于类型- 是声明 IUnityController ImVController的接口 - 使容器与 mVController 具有相同类型mVControllerResolve

我想知道我是否mVController = null在不再需要时放入 GC 输入/对象将有资格收集?

或者table将持有对类型对象的引用ImVController?我猜它会符合条件。

如果声明了某个对象怎么办:

object newObject = DomainObjectFactory.GetObject(typeOfObject);

然后它使用 mVController:

(newObject as Class1).MethodFromClass1(mVController.Property1, mVController.Property2, ...);

我是否摆脱了这样的参考:

object = null;那么它会在某个时间被收集吗?

另一个问题:引用是否应该在方法中与 ref 一起传递(例如public void method(ref Type obj) ,然后在方法中 make obj = null; 以便对象也为 null?来自所有项目的所有 ref 都指向 null> 以便 GC 可以收集?和然后也使用 ref 调用该方法:method (ref obj)何时不再需要该对象并且应该超出范围?

谢谢

4

1 回答 1

0

如果我在不再需要时放置 mVController = null GC 输入/对象是否有资格收集?

取决于 IUnityController 的实现:如果它拥有 ImVController,则重置 mVController 将没有利润。无论如何,在您的应用程序内存不足之前,GC 不会收集垃圾。

使 obj = null; 在方法中,使对象也为空

如果您的对象被其他变量/对象引用,GC 将不会收集它。如果没有,您的对象将被收集。一段时间。

于 2013-04-18T13:09:21.297 回答