【发布时间】:2016-03-06 09:38:30
【问题描述】:
我正在努力理解对象的处理和垃圾收集。特别是,我不明白为什么我仍然可以使用已处置的对象。我并没有尝试做任何实际的事情,我现在只是在玩理论,根据我的理解,我认为我无法做到以下几点:
class Program
{
static void Main(string[] args)
{
Person p = new Person();
using (p)
{
p.Name = "I am Name";
}
Console.WriteLine(p.Name); // I thought this would break because I've already disposed of p
Console.ReadLine();
}
}
public class Person : IDisposable
{
public string Name;
public void Dispose()
{
Console.WriteLine("I got killed...");
}
}
我希望有人可以在这里给我一些方向或指导,以消除我对这个概念的误解?
【问题讨论】:
-
使用
using的常规方式是(using p = new Person()){ ... }。这样一来,您就不必担心一次性用品。 -
@shay__: 是的 - 因为通常有包装类也会处理它们包装的内容,例如带有流和
StreamWriter。此外,有时您确实想在之后访问已处置的对象。我认为这是一个完全合理的问题。 -
@JonSkeet 非常感谢!我认为这消除了我在这里的误解。我一直认为该对象被 Dispose() 破坏了,但这只是我摆脱 CLR 不会为我摆脱的非托管资源的机会,然后我可以用托管的东西做我想做的事,直到不再GC 会在什么时候为我解决这个问题?我在想 Dispose() 方法做了一些神奇的事情,这让我对我正在尝试的事情感到困惑。再次感谢!