Dan*_*an7 5 c# garbage-collection dispose idisposable
在C#中使用新对象重新分配一次性对象变量时,它在内存中是如何工作的?旧对象占用的内存空间是否会被新对象覆盖?或者我是否还要打电话Dispose()来释放它使用的资源?
DisposableThing thing;
thing = new DisposableThing();
//....do stuff
//thing.Dispose();
thing = new DisposableThing();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您有一个插槽/引用和一个IDisposable对象的两个实例.这两个实例都必须独立处理.编译器不会插入任何魔法IDisposable.它只会更改引用所指向的实例
一个好的模式将是以下
using (thing = new DisposableThing()) {
// ... do stuff
}
thing = new DisposableThing();
Run Code Online (Sandbox Code Playgroud)
理想情况下,第二次使用thing也应在一个using区块内完成
小智 4
它的工作原理与任何其他任务相同:=不关心IDisposable或执行任何魔法。
最初分配给变量的对象必须根据需要Dispose手动调用(或者更好的是使用using)。Dispose然而,此时调用可能并不总是正确的:谁拥有该对象并控制生命周期?
旧对象占用的内存空间会被新对象覆盖吗?
不适用。变量“名称”对象。对象就是它本身,变量就是变量——而不是对象或“内存中的位置”。(请参阅下面 Eric Lippert 的评论:前面是变量的高级视图,而 Eric 的评论更准确地反映了 C# 实现、精神和术语中的变量。)
变量只会影响对象的生命周期,因为它们可以*防止对象被回收(从而阻止终结器[可能最终]运行)。然而,变量不控制对象的语义生命周期——即使对象不可回收,也可能被处置——或者消除Dispose根据需要调用的需要。
快乐编码。
当处理超出简单范围的一次性对象时——这些对象在其生命周期内可能被分配给许多不同的变量!-- 我发现最好定义谁“控制”我在文档中注释的内容。如果对象的生命周期很好地限制在一个范围内,那么using效果就很好。
*局部变量本身不一定足以保持对象的强可达性,因为如果稍后不在同一范围内使用该变量/赋值,则可能会被积极优化。这可能会困扰计时器等对象。
| 归档时间: |
|
| 查看次数: |
2070 次 |
| 最近记录: |