打破对表单C#的引用

时间:2013-04-18 13:01:32

标签: c# pass-by-reference

我有一个许可项目(数据库交互项目),我想从一个从数据库加载数据的表单中删除所有引用,因为我加载了大量数据并且内存使用率很高。我分析了应用程序(.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&gt; GC可以收集吗?  然后当不再需要该对象并且应该超出范围时,还使用ref:method (ref obj)调用该方法?

由于

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

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