如何重新分配一次性对象变量?

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)

Jar*_*Par 5

在这种情况下,您有一个插槽/引用和一个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效果就很好。

*局部变量本身不一定足以保持对象的强可达性,因为如果稍后不在同一范围内使用该变量/赋值,则可能会被积极优化。这可能会困扰计时器等对象。

  • 变量不命名*对象*。变量(有名称的变量)名称*存储位置*。如果变量是引用类型,则存储位置包含对对象的“引用”;如果变量是值类型,则存储位置包含“对象”。当然,并非所有变量都有名称,有些变量有多个名称。 (4认同)