Почему мы все еще можем использовать удаленный объект? - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть класс DisposedPatterenDemo, наследуемый от IDisposable. Я удалил объект этого класса, а затем после того, как он пытается вызвать метод () того же класса, я получаю возвращаемое значение от метода, но объект 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 Ответ

1 голос
/ 20 февраля 2020

Только удаление означает, что неуправляемые ресурсы, используемые объектом, будут удалены. Это не значит, что объект будет очищен от памяти. Это означает, что методы этого объекта, который не зависит от каких-либо неуправляемых ресурсов, могут по-прежнему вызываться без проблем.

Чтобы предотвратить это, как предложил @Matthew, вам нужно сохранить переменную экземпляра, которая сообщает, является ли текущий экземпляр был удален или нет, и обработайте его соответствующим образом в методе.

...