【发布时间】:2015-02-19 04:38:56
【问题描述】:
我正在开发单声道和 .net 应用程序。我有一些关于最佳做法的基本问题。
如果我需要创建一个非托管对象只使用一次(可能传递给一个方法或调用其中一个方法)并且以后不需要它,我应该先将它分配给一个变量然后使用它以便我可以处理它(或者可以在
using()块中分配变量)或者我应该像new Class().Method()一样使用,以便 GC 能够收集它?最佳做法是什么?我是否需要处置仅具有方法的局部范围的对象,或者如果我处置属于类(全局)属性的对象就足够了吗?
-
我有一个 A 类和一个 B 类。B 的一个对象是在 A 类的某个方法 M 中创建的。这个(B 类的)对象有另一个方法 M2,它调用 A 类中的第二个方法 M3。所以结构如下
Class A { void M() { var b = new B(); } public string M3() { return "OK"; } } Class B { void M2() { Console.WriteLine(new A().M3(); } }
这会创建一个循环引用并阻止 GC 收集这两个对象吗?
良好的内存效率编程的其他一般原则是什么?
【问题讨论】:
-
这是所有托管代码。您真正需要参与内存管理和对象处理的几乎唯一一次是使用非托管资源(使用
IDisposable和using以节省许多麻烦,或者在每次使用时交替尝试/最终确保调用dispose)或者您正在管理资源连接,例如数据库连接或流(最有可能实现 IDisposable,因此放置得当的using也可以将您保存在那里)。
标签: c# .net memory-management mono garbage-collection