相关疑难解决方法(0)

C#:应该将对象变量赋值为null吗?

在C#中,null如果你已经完成使用它,是否有必要分配一个对象变量,即使它会超出范围?

c# null garbage-collection

45
推荐指数
6
解决办法
2万
查看次数

"using"关键字是否意味着对象被处理并且GC'了?

我今天和我的同事进行了一次对话,她说她刚刚了解了使用该using声明背后的原因.

 //Using keyword is used to clean up resources that require disposal (IDisposable interface). 

 using (StreamReader reader = new StreamReader(@"C:\test.txt")) 
 { 
 string line = reader.ReadLine(); 
 } 
Run Code Online (Sandbox Code Playgroud)

我指出,除非GC决定这样做,否则该物体被标记为"可以处置"但实际上没有处理和垃圾收集.

她回答说,一旦using语句结束,对象将自动处理,因为using语句被转换为try-catch-finally块.因此,对象必须放在using语句的最后.

我对此感到困惑,因为我知道使用using语句并不能保证对象被GC收集.所有发生的事情都是Dispose()调用该方法.GC无论如何都决定GC.但当她要求证明时,我找不到任何证据.

有谁知道这是如何工作的,以及如何证明它?

.net c# garbage-collection dispose

35
推荐指数
2
解决办法
3157
查看次数

在什么情况下,我们需要两次调用GC.Collect

我们有一个WPF应用程序,基于Unity和MMVVVM模式.在应用程序生命周期中,可能存在多个项目生命周期,在每个项目生命周期之后,我们执行手动拆除并尝试释放ViewModel的所有引用.对于使用Unity的事件订阅,我们使用弱引用.因此我们假设在拆除之后,我们可以调用GC Collect,以便所有垃圾对象都被垃圾收集.我们还有另一个手动取消订阅所有事件的选项,但我们更喜欢垃圾收集,因为它将为我们清除大约200MB,这将有助于新项目加载.

有一个实例,我们观察到,如果我只调用GC.Collect一次,它的引用仍然会在内存中保留一段时间.

GC.Collect();
GC.WaitForPendingFinalizers(); 
Run Code Online (Sandbox Code Playgroud)

但如果我尝试连续两次调用GC,它会很好地清理所有内容.

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

任何想法或指示将受到高度赞赏.

更新:

Class中没有定义Finalizer.

现在我也在考虑一个案例,其中这个对象在另一个可能有终结器的对象中被引用.在我们的框架中,我们只有DBProvider的终结器,所以我不认为,即使是这种情况.

.net garbage-collection

10
推荐指数
2
解决办法
4413
查看次数

标签 统计

garbage-collection ×3

.net ×2

c# ×2

dispose ×1

null ×1