c# - 为什么你仍然可以使用已处置的对象?

标签 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...");
    }
}

我希望有人能在这里给我一些方向或指导,以消除我对这个概念的误解?

最佳答案

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

如果您不使已处置的对象在您对其执行进一步操作时失败,它就不会。事实上,在某些情况下您确实希望能够 - 例如,在 MemoryStream 上调用 ToArray 在它被释放后就可以了,即使尽管您不能调用 Read 等。在写入 MemoryStream 的情况下,从将处理 MemoryStream 的包装器链接起来,这真的很方便,但您需要之后的数据。

但一般来说,您应该编写就好像您不能在处理后使用已处理的对象,除非您确定它仍然支持您需要的操作。 “我希望它会坏掉……”的默认位置是安全的。

关于c# - 为什么你仍然可以使用已处置的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35825309/

相关文章:

c# - Razor.Parse 替代方案

c++ - C++ 中灵活的类行为

JavaScript 原型(prototype)构造函数仅调用一次

ruby - 类对象,单例类

c# - 具有 RIA 服务 + Entity Framework 的 silverlight 4 的身份验证/授权

c# - 如何在多个可执行文件中重用 .NET 资源?

java - C# 和 Java 中从字符串获取字节数组的区别

c# - XPathSelectElement 中的变量

python - 解释每个 open() 语句一次读取操作的行为?

oop - 耦合性和内聚性