在编写.NET代码时,关于避免内存泄漏的"注意"列表是什么?

Moh*_*awi 10 .net memory-leaks

当您编写数千行.NET代码时,您要记住什么以避免内存泄漏?我是防止检查的忠实粉丝,有一个着名的例子,关于这一点,使用"StringBuilder"来组合字符串而不是"String1 + String2",那么你的编码经验还有什么呢?

提前感谢您分享您的想法.

Ily*_*kov 12

活动.始终取消订阅事件,这是.NET提供的最大漏洞功能.

订阅活动意味着"在你还活着的时候通知并抱着我",而不是"在我活着的时候通知我".未能取消订阅事件通常会导致大量挂起的对象,尤其是在UI中.


Gul*_*zim 6

使用后将根引用设置为null.

这里有更多信息:如果我们忘记取消root化引用,则无法尽快有效地释放内存,从而导致应用程序的内存占用更大.问题可能很微妙,例如在进行远程调用(如数据库查询或调用Web服务)之前创建临时对象的大图形的方法.如果在远程调用期间发生垃圾收集,则整个图表都标记为可访问且未收集.这变得更加昂贵,因为收藏中存活的物品被提升到下一代,这可能导致中年危机.

  • 将变量设置为null很少有用,并且会使代码混乱.特别是,当在方法的其余部分中不再使用局部变量时,它将不会被视为释放模式中的根.通常,只要对象本身是有根的,实例变量就很有用. (3认同)

Ty.*_*Ty. 5

确保始终处理IDisposable对象.此外,尝试始终使用"using(...)"块来声明一次性对象.


Ovi*_*rar 2

每个 DataTable.NewRow() 必须有一个匹配的 DaraTable.Rows.Add(...)。