我正在努力理解对象的处理和垃圾收集。特别是,我不明白为什么我仍然可以使用已处置的对象。我并没有尝试做任何实际的事情,我现在只是在玩弄理论,据我所知,我认为我无法做到以下几点:
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...");
}
}
我希望有人能在这里给我一些方向或指导,以消除我对这个概念的误解?
最佳答案
处理一个对象并没有什么神奇的作用——CLR 根本不关心 IDisposable
...它只是一个在 C#(和其他语言)中支持的框架接口(interface).调用 Dispose
就像调用其他方法一样。
如果您不使已处置的对象在您对其执行进一步操作时失败,它就不会。事实上,在某些情况下您确实希望能够 - 例如,在 MemoryStream
上调用 ToArray
在它被释放后就可以了,即使尽管您不能调用 Read
等。在写入 MemoryStream
的情况下,从将处理 MemoryStream 的包装器链接起来,这真的很方便
,但您需要之后的数据。
但一般来说,您应该编写就好像您不能在处理后使用已处理的对象,除非您确定它仍然支持您需要的操作。 “我希望它会坏掉……”的默认位置是安全的。
关于c# - 为什么你仍然可以使用已处置的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35825309/