为什么我们仍然可以使用已处置的对象?
Why can we still use a disposed object?
我从 IDisposable 继承了 DisposedPatterenDemo class。我已经处理了这个 class 的对象,然后在它尝试调用同一个 class 的 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;
}
}
}
Disposing only 表示对象使用的非托管资源将被处理掉。这并不意味着该对象会从内存中清除。这意味着仍然可以毫无问题地调用不依赖于任何非托管资源的该对象的方法。
为了防止这种情况,正如@Matthew 所建议的,您需要保留一个实例变量来指示当前实例是否已被释放,并在方法中进行相应处理。
我从 IDisposable 继承了 DisposedPatterenDemo class。我已经处理了这个 class 的对象,然后在它尝试调用同一个 class 的 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;
}
}
}
Disposing only 表示对象使用的非托管资源将被处理掉。这并不意味着该对象会从内存中清除。这意味着仍然可以毫无问题地调用不依赖于任何非托管资源的该对象的方法。
为了防止这种情况,正如@Matthew 所建议的,您需要保留一个实例变量来指示当前实例是否已被释放,并在方法中进行相应处理。