【问题标题】:breaking references to a form C#打破对表单 C# 的引用
【发布时间】:2013-04-18 13:01:32
【问题描述】:

我有一个许可证项目(数据库交互项目),我想从从数据库加载数据的表单中删除所有引用,因为我加载了大量数据并且内存使用率很高。我分析了应用程序(.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 的接口 Resolve - 制作与 mVController 相同类型的容器

我想知道我是否在不再需要时输入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) 然后使 obj = null;在方法中使对象也为空?所有项目的所有参考都指向 null> 以便 GC 可以收集吗? 然后在不再需要对象并且应该超出范围时也使用 ref:method (ref obj) 调用该方法?

谢谢

【问题讨论】:

    标签: c# pass-by-reference


    【解决方案1】:

    如果我在不再需要时设置 mVController = null,GC 进入 / 对象将有资格被收集吗?

    依赖于IUnityController的实现:如果它拥有ImVController,那么重置mVController就没有利润了。无论如何,在您的应用内存不足之前,GC 不会收集垃圾。

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

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

    【讨论】:

    • 那么打破对对象的引用的最佳做法是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多