我正在学习C#.据我所知,您必须正确设置以使垃圾收集器实际删除所有内容.我正在寻找多年来从你那里学到的智慧,聪明.
我来自C++背景,非常习惯代码气味和开发模式.我想知道C#中的代码气味是什么样的.给我建议!
删除内容的最佳方法是什么?
如何解决"内存泄漏"问题?
编辑:我正在尝试开发一个"总是为内存管理做的东西"的列表
非常感谢.
C#,.NET Framework使用托管内存,所有内容(但分配的非托管资源)都是垃圾回收.
可以安全地假设托管类型总是被垃圾收集.那包括arrays
,classes
和structures
.随意做int[] stuff = new int[32];
,忘记它.
如果在类中打开文件,数据库连接或任何其他非托管资源,请实现IDisposable接口,并在Dispose方法中取消分配非托管资源.
任何实现IDisposable的类都应该显式关闭,或者在(我认为很酷)使用块中使用;
using (StreamReader reader = new StreamReader("myfile.txt")) { ... your code here }
这里.NET将在{}范围之外处置读取器.
GC的第一件事是它是非确定性的; 如果你想及时清理资源,实施IDisposable
和使用using
; 这不会收集托管内存,但可以帮助很多非托管资源和转发链.
特别需要注意的事项:
很多钉扎(对GC的作用有很多限制)
很多终结器(你通常不需要它们;减慢GC)
静态事件 - 保持大量对象图存活的简单方法;-p
廉价的长寿命物体上的事件,可以看到应该清理的昂贵物体
"捕获变量"意外地保持图表活着
为了调查内存泄漏......"SOS"是最简单的路线之一; 您可以使用SOS查找类型的所有实例,以及可以看到它的内容等.