using语句 - 是否会触发垃圾回收?

时间:2012-08-13 03:23:40

标签: c# memory

我想要做的是将一些可疑函数包装在using语句中以触发垃圾回收,是否有人使用过或看过这样的东西?这有用吗?你对此有什么看法?

using (String wrapper = new String("maybe this will trigger gc")){
  //do stuff here
  //or maybe:
  // function1();
  // function2();
  //
  //and then see if its leaking?

  // eg:
       _mygeometry = new Geometry();
       _mygeometry = null; // will GC free this ?
}

你认为这会有效吗?你之前用过这个吗?有什么我可以做的不是一个字符串?我使用WPF,我尝试使用(var garbage = 1){}并且不起作用,我猜可能是String。

2 个答案:

答案 0 :(得分:7)

using语句仅适用于那些实现IDisposable的类。它只是确保您在using()内定义的对象在执行块之后调用其Dispose方法,或者甚至在发生某些异常时调用它。这类似于将tryfinally块一起使用。

如果您怀疑应用程序中存在内存泄漏,那么如果您使用一些可用的内存分析器来检测问题则会更好。

您当前的代码不应该编译为String类没有实现IDisposable

编辑:

自编辑后的问题

_mygeometry = null; // will GC free this ?

你应该看到这个SO链接: C#: should object variables be assigned to null? 并从VinayC回答

答案 1 :(得分:1)

只能在IDisposable语句中使用实现using(...){...}的类。

  

using语句允许程序员指定对象的时间   使用资源应该释放它们。提供给使用的对象   语句必须实现IDisposable接口。这个界面   提供Dispose方法,该方法应该释放对象   资源。

来源:MSDN

不幸的是,string does not implement this interface。你怀疑一个字符串是否导致你的应用程序内存泄漏?你在忙什么?你可以发布一些代码,以便我们能够检查它吗?