對處置對象調用方法是否合法?如果是,爲什麼?爲什麼配置對象在使用後不拋出異常?
在下面的演示程序,我已經一次性類A
(它實現IDisposable
接口)。由於據我所知,如果我通過一次性對象using()
構建體,然後Dispose()
方法得到在閉合托架自動調用:
A a = new A();
using (a)
{
//...
}//<--------- a.Dispose() gets called here!
//here the object is supposed to be disposed,
//and shouldn't be used, as far as I understand.
如果這是正確的,那麼請解釋該程序的輸出:
public class A : IDisposable
{
int i = 100;
public void Dispose()
{
Console.WriteLine("Dispose() called");
}
public void f()
{
Console.WriteLine("{0}", i); i *= 2;
}
}
public class Test
{
public static void Main()
{
A a = new A();
Console.WriteLine("Before using()");
a.f();
using (a)
{
Console.WriteLine("Inside using()");
a.f();
}
Console.WriteLine("After using()");
a.f();
}
}
輸出(ideone):
Before using()
100
Inside using()
200
Dispose() called
After using()
400
如何在a
上撥打f()
?這是否允許?如果是,那爲什麼?如果不是,那麼爲什麼上面的程序在運行時不會出現異常?
我知道,使用using
流行的結構是這樣的:
using (A a = new A())
{
//working with a
}
但我只是嘗試,這就是爲什麼我寫的不同。
我看到有人錯過了C++中內存管理的確定性本質。 :) – ChaosPandion
所以你說的是:我寫了一個程序,沒有實現一次性對象的合同,當我運行它時,它沒有實現一次性對象的合同。 **您**負責實施該行爲。你沒有這樣做。去這樣做。 –