为什么我们仍然可以使用已处置的对象?

时间:2020-02-20 09:26:16

标签: c# asp.net garbage-collection idisposable suppressfinalize

我有DisposedPatterenDemo类继承自IDisposable。我已经处置了此类的对象,然后在尝试调用同一类的Method()之后,我从Method获得了返回值,但obj已被处置。 var res = obj.Method();不失败?为什么它没有失败?

     class Program
        {
            static void Main(string[] args)
            {

                DisposedPatterenDemo obj = new DisposedPatterenDemo();
                obj.Initialize();
                obj.Dispose();
                var res=obj.Method(); //Here it return value
    }
    }


 class DisposedPatterenDemo:IDisposable
    {
        private bool Disposed = false;
        StreamReader str = null;
        PaymentStub obj = new PaymentStub();

        public void Initialize()
        {
            str = new StreamReader(@"C:\Test\abc.pdf");
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);

        }
        public string Method()
        {
            var abc = "New";
            return abc;
        }
        public void Dispose(bool disposing)
        {
            if (!Disposed)
            {
                if (disposing)
                {
                    Console.WriteLine("Called From Dispose");
                    if(str!=null)
                    {
                        str.Dispose();
                    }
                }
                else
                {
                    //Clear all the unmanaged resources here  
                }
                Disposed = true;
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

仅处置意味着将处置对象使用的非托管资源。这并不意味着该对象将从内存中清除。这意味着不依赖于任何非托管资源的该对象的方法仍可以毫无问题地被调用。

为防止这种情况发生,正如@Matthew所建议的那样,您需要保留一个实例变量以告知当前实例是否已处置,并在方法中进行相应处理。