你为什么还能使用被处置物?

mac*_*hew 3 c# oop

我正在努力了解处理对象和垃圾收集.特别是,我不明白为什么我仍然可以使用处置对象.我不是想做任何实际的事情,我现在只是在玩理论,在我的理解中,我认为我无法做到以下几点:

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...");
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望有人可以在这里给我一些指导或指导,以便澄清我对这个概念的误解?

Jon*_*eet 8

处置一个对象并没有什么神奇之处 - CLR根本不关心IDisposable......它只是一个在C#(和其他语言)中得到支持的框架接口.调用Dispose就像调用其他方法一样.

如果在对其执行进一步操作时未使配置对象失败,则不会.事实上,也有一些情况下,你真的希望能够-例如,要求ToArrayMemoryStream它的配置之后是好的,即使你不能打电话Read等.可以在写操作的情况下非常方便的MemoryStream从链一个包装器,它将处理MemoryStream,但你想要的数据.

但一般情况下,您应该编写代码,好像在处理后不能使用已处置的对象,除非您确定它仍然支持您需要的操作.默认位置"我希望它会破..."是一个安全的位置.

  • 请注意.Net提供了[ObjectDisposedException](https://msdn.microsoft.com/en-us/library/system.objectdisposedexception%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)类如果某个方法在被处理之后调用了类中的方法,则可以抛出 一些一次性类会跟踪它们是否被丢弃,如果你之后尝试使用它们,则抛出`ObjectDisposedException` - 但其他一次性类则没有. (2认同)