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